C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法

C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法,第1张

概述本文实例讲述了C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户同步的方法。分享给大家供大家参考,具体如下:

本文实例讲述了C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法。分享给大家供大家参考,具体如下:

摘要:C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景。该类可实现以下功能:如果资源未被写 *** 作锁定,那么任何线程都可对该资源进行读 *** 作锁定,并且对读 *** 作锁数量没有限制,即多个线程可同时对该资源进行读 *** 作锁定,以读取数据。

使用Monitor或Mutex进行同步控制的问题:由于独占访问模型不允许任何形式的并发访问,这样的效率总是不太高。许多时候,应用程序在访问资源时是进行读 *** 作,写 *** 作相对较少。为解决这一问题,C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景。该类可实现以下功能:如果资源未被写 *** 作锁定,那么任何线程都可对该资源进行读 *** 作锁定,并且对读 *** 作锁数量没有限制,即多个线程可同时对该资源进行读 *** 作锁定,以读取数据。如果资源未被添加任何读或写 *** 作锁,那么一个且仅有一个线程可对该资源添加写 *** 作锁定,以写入数据。简单的讲就是:读 *** 作锁是共享锁,允许多个线程同时读取数据;写 *** 作锁是独占锁,同一时刻,仅允许一个线程进行写 *** 作。

示例代码如下:

using System;using System.Threading;namespace Processtest{ class Program {  //资源  static int theResource = 0;  //读、写 *** 作锁  static ReaderWriterLock rwl = new ReaderWriterLock();  static voID Main(string[] args)  {   //分别创建2个读 *** 作线程,2个写 *** 作线程,并启动   Thread tr0 = new Thread(new ThreadStart(Read));   Thread tr1 = new Thread(new ThreadStart(Read));   Thread tr2 = new Thread(new ThreadStart(Write));   Thread tr3 = new Thread(new ThreadStart(Write));   tr0.Start();   tr1.Start();   tr2.Start();   tr3.Start();   //等待线程执行完毕   tr0.Join();   tr1.Join();   tr2.Join();   tr3.Join();   System.Console.ReadKey();  }  //读数据  static voID Read()  {   for (int i = 0; i < 3; i++)   {    try    {     //申请读 *** 作锁,如果在1000ms内未获取读 *** 作锁,则放弃     rwl.AcquireReaderLock(1000);     Console.Writeline("开始读取数据,theResource = {0}",theResource);     Thread.Sleep(10);     Console.Writeline("读取数据结束,theResource = {0}",theResource);     //释放读 *** 作锁     rwl.ReleaseReaderLock();    }    catch (ApplicationException)    {     //获取读 *** 作锁失败的处理    }   }  }  //写数据  static voID Write()  {   for (int i = 0; i < 3; i++)   {    try    {     //申请写 *** 作锁,如果在1000ms内未获取写 *** 作锁,则放弃     rwl.AcquireWriterLock(1000);     Console.Writeline("开始写数据,theResource = {0}",theResource);     //将theResource加1     theResource++;     Thread.Sleep(100);     Console.Writeline("写数据结束,theResource = {0}",theResource);     //释放写 *** 作锁     rwl.ReleaseWriterLock();    }    catch (ApplicationException)    {     //获取写 *** 作锁失败    }   }  } }}

上例中分别创建2个读取线程和2个写入线程,交替进行读、写 *** 作。运行结果如下图:

观察运行结果,我们很容易看出:读 *** 作锁是共享锁,允许多个线程同时读取数据;写 *** 作锁是独占锁,仅允许一个线程进行写 *** 作。

如果一个线程在获取读 *** 作锁后,进行读 *** 作的途中,希望提升锁级别,将其变为写 *** 作锁,可以调用ReaderWriterLock类的UpgradetoWriterLock(int timeOut)方法,该方法返回一个Lockcookie值,该值保存了UpgradetoWriterLock方法调用前线程锁的状态。待写 *** 作完成后,可调用DowngradeFromWriterLock(Lockcookie lockcookie)方法,该方法根据传入的Lockcookie参数值,将线程锁恢复到UpgradetoWriterLock方法调用前的状态。具体使用方法,大家可以查看MSDN以获取相关示例。

希望本文所述对大家C#程序设计有所帮助。

总结

以上是内存溢出为你收集整理的C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法全部内容,希望文章能够帮你解决C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1254589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存