现在的位置: 首页 > 综合 > 正文

C#开发之多线程数据同步

2013年09月16日 ⁄ 综合 ⁄ 共 1267字 ⁄ 字号 评论关闭

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率.

实例讲解:
在一个例子中,由函数add实现一数据的增加,delete实现该数据的减少,如果多线程同时操作该数据时,会出现增加的同时减少操作,这样很可能会出现增加没有完成时,最后只完成了数据的减少操作。

看例子:

private int count = 12;
        public void  add() {
                Console.WriteLine("add方法前" + count);
                count += 2;
                Console.WriteLine("add方法后" + count);
        }

        public void  delete() {
                Console.WriteLine("delete方法前" + count);
                count -= 2;
                Console.WriteLine("delete方法后" + count);
        }
		
		private void button5_Click(object sender, EventArgs e) {
            //线程同步
            Thread[] t = new Thread[10];
            for(int i = 0; i < t.Length; i++) {
                if(i % 2 == 0) {
                    t[i] = new Thread(new ThreadStart(add));
                } else {
                    t[i] = new Thread(new ThreadStart(delete));
                }          
            }
            for(int i = 0; i < t.Length; i++) {
                t[i].Start();
            }
        }

以上代码会出现数据不同步现象,贴图显示:

在C#里面用于实现线程同步的常用类有如下几类:
1、Mutex类(互斥器),Monitor类,lock方法
2、ManualResetEvent类,AutoResetEvent类(这两个都是由EventWaitHandle类派生出来的)
3、ReaderWriterLock类
C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。
下面只用到Lock方法:
这样修改后,即可,只需要修改调用的方法即可,在线程创建和执行时与之前没有差别:

private static object myLock = new object();
        private int count = 12;
        public void  add() {
            lock(myLock) {
                Console.WriteLine("add方法前" + count);
                count += 2;
                Console.WriteLine("add方法后" + count);
            }
        }

        public void  delete() {
            lock(myLock) {
                Console.WriteLine("delete方法前" + count);
                count -= 2;
                Console.WriteLine("delete方法后" + count);
            }
        }

抱歉!评论已关闭.