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