首页 > 编程 > C# > 正文

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

2019-10-29 21:36:06
字体:
来源:转载
供稿:网友

这篇文章主要介绍了C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法,涉及C#多线程操作读写锁定的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

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

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

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

示例代码如下:

 

 
  1. using System; 
  2. using System.Threading; 
  3. namespace ProcessTest 
  4. class Program 
  5. //资源 
  6. static int theResource = 0; 
  7. //读、写操作锁 
  8. static ReaderWriterLock rwl = new ReaderWriterLock(); 
  9. static void Main(string[] args) 
  10. //分别创建2个读操作线程,2个写操作线程,并启动 
  11. Thread tr0 = new Thread(new ThreadStart(Read)); 
  12. Thread tr1 = new Thread(new ThreadStart(Read)); 
  13. Thread tr2 = new Thread(new ThreadStart(Write)); 
  14. Thread tr3 = new Thread(new ThreadStart(Write)); 
  15. tr0.Start(); 
  16. tr1.Start(); 
  17. tr2.Start(); 
  18. tr3.Start(); 
  19. //等待线程执行完毕 
  20. tr0.Join(); 
  21. tr1.Join(); 
  22. tr2.Join(); 
  23. tr3.Join(); 
  24. System.Console.ReadKey(); 
  25. //读数据 
  26. static void Read() 
  27. for (int i = 0; i < 3; i++) 
  28. try 
  29. //申请读操作锁,如果在1000ms内未获取读操作锁,则放弃 
  30. rwl.AcquireReaderLock(1000); 
  31. Console.WriteLine("开始读取数据,theResource = {0}", theResource); 
  32. Thread.Sleep(10); 
  33. Console.WriteLine("读取数据结束,theResource = {0}", theResource); 
  34. //释放读操作锁 
  35. rwl.ReleaseReaderLock(); 
  36. catch (ApplicationException) 
  37. //获取读操作锁失败的处理 
  38. //写数据 
  39. static void Write() 
  40. for (int i = 0; i < 3; i++) 
  41. try 
  42. //申请写操作锁,如果在1000ms内未获取写操作锁,则放弃 
  43. rwl.AcquireWriterLock(1000); 
  44. Console.WriteLine("开始写数据,theResource = {0}", theResource); 
  45. //将theResource加1 
  46. theResource++; 
  47. Thread.Sleep(100); 
  48. Console.WriteLine("写数据结束,theResource = {0}", theResource); 
  49. //释放写操作锁 
  50. rwl.ReleaseWriterLock(); 
  51. catch (ApplicationException) 
  52. //获取写操作锁失败 

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

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

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

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

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


注:相关教程知识阅读请移步到c#教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表