欢迎来到天天文库
浏览记录
ID:8797586
大小:44.50 KB
页数:6页
时间:2018-04-08
《c#中数据的同步加锁机制》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、C#中数据的同步加锁机制收藏对于数据库中,为数据或是访问数据的函数加锁是常见的,但是在C#中数据的同步加锁机制是什么样呢?在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中由于大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁,好在Framework中已经为我们提供了三个加锁的机制,分别是Monitor类、Lock关键字和Mutex类。其中Lock关键词用法比较简单,Monitor类和Lock的用法差不多。这两个都
2、是锁定数据或是锁定被调用的函数。而Mutex则多用于锁定多线程间的同步调用。简单的说,Monitor和Lock多用于锁定被调用端,而Mutex则多用锁定调用端。例如下面程序:由于这种程序都是毫秒级的,所以运行下面的程序可能在不同的机器上有不同的结果,在同一台机器上不同时刻运行也有不同的结果,我的测试环境为vs2005,windowsXp,CPU3.0,1Gmonery。程序中有两个线程thread1、thread2和一个TestFunc函数,TestFunc会打印出调用它的线程名和调用的时间(mm级的),两
3、个线程分别以30mm和100mm来调用TestFunc这个函数。TestFunc执行的时间为50mm。程序如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading;namespaceMonitorLockMutex{classProgram{#regionvariableThreadthread1=null;Threadthread2=null;Mutexmutex=null;#endregio
4、nstaticvoidMain(string[]args){Programp=newProgram();p.RunThread();Console.ReadLine();}publicProgram(){mutex=newMutex();thread1=newThread(newThreadStart(thread1Func));thread2=newThread(newThreadStart(thread2Func));}publicvoidRunThread(){thread1.Start();thre
5、ad2.Start();}privatevoidthread1Func(){for(intcount=0;count<10;count++){TestFunc("Thread1haverun"+count.ToString()+"times");Thread.Sleep(30);}}privatevoidthread2Func(){for(intcount=0;count<10;count++){TestFunc("Thread2haverun"+count.ToString()+"times");Thre
6、ad.Sleep(100);}}privatevoidTestFunc(stringstr){Console.WriteLine("{0}{1}",str,System.DateTime.Now.Millisecond.ToString());Thread.Sleep(50);}}}运行结果如下:可以看出如果不加锁的话,这两个线程基本上是按照各自的时间间隔+TestFunc的执行时间(50mm)对TestFunc函数进行读取。因为线程在开始时需要分配内存,所以第0次的调用不准确,从第1~9次的调用可以看出,
7、thread1的执行间隔约是80mm,thread2的执行间隔约是150mm。现在将TestFunc修改如下:privatevoidTestFunc(stringstr){lock(this){Console.WriteLine("{0}{1}",str,System.DateTime.Now.Millisecond.ToString());Thread.Sleep(50);}}或者是用Monitor也是一样的,如下:privatevoidTestFunc(stringstr){Monitor.Enter(
8、this);Console.WriteLine("{0}{1}",str,System.DateTime.Now.Millisecond.ToString());Thread.Sleep(50);Monitor.Exit(this);}其中Enter和Exit都是Monitor中的静态方法。运行Lock结果如下:让我们分析一下结果,同样从第1次开始。相同线程间的调用时间间隔为线程执行时间+TestFunc调用时间
此文档下载收益归作者所有