c#中数据的同步加锁机制

c#中数据的同步加锁机制

ID:8797586

大小:44.50 KB

页数:6页

时间:2018-04-08

c#中数据的同步加锁机制_第1页
c#中数据的同步加锁机制_第2页
c#中数据的同步加锁机制_第3页
c#中数据的同步加锁机制_第4页
c#中数据的同步加锁机制_第5页
资源描述:

《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调用时间

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。