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

来源:互联网 发布:ubuntu怎么读 编辑:程序博客网 时间:2024/05/01 09:07

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。可以提高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);            }        }
原创粉丝点击