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

 更新时间:2015年11月18日 10:27:27   作者:mile  
这篇文章主要介绍了C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法,涉及C#多线程操作读写锁定的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了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#实现串口调试工具

    C#实现串口调试工具

    这篇文章介绍了C#实现串口调试工具的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#进度轴控件分享

    C#进度轴控件分享

    这里给大家介绍的是使用C#实现的进度轴的方法和示例,非常的实用,有需要的小伙伴可以参考下。
    2015-06-06
  • c#的dataset离线数据集示例

    c#的dataset离线数据集示例

    这篇文章主要介绍了c#的dataset离线数据集示例,需要的朋友可以参考下
    2014-04-04
  • 详解C# 托管资源和非托管资源

    详解C# 托管资源和非托管资源

    这篇文章主要介绍了详解C# 托管资源和非托管资源的相关资料,需要的朋友可以参考下
    2016-01-01
  • c#对list排序示例

    c#对list排序示例

    本文主要介绍了c#对List成员排序的示例,大家参考使用吧
    2014-01-01
  • C#实现JSON解析器MojoUnityJson功能(简单且高效)

    C#实现JSON解析器MojoUnityJson功能(简单且高效)

    MojoUnityJson 是使用C#实现的JSON解析器 ,算法思路来自于游戏引擎Mojoc的C语言实现 Json.h。这篇文章主要介绍了C#实现JSON解析器MojoUnityJson的方法,需要的朋友可以参考下
    2018-01-01
  • C#基于Modbus三种CRC16校验方法的性能对比

    C#基于Modbus三种CRC16校验方法的性能对比

    这篇文章主要介绍了C#基于Modbus三种CRC16校验方法的性能对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Unity 从UI中拖拽对象放置并拖动效果 附demo

    Unity 从UI中拖拽对象放置并拖动效果 附demo

    最近新接了个需求,要求模拟场景并生成3D对象,对象可以跟随鼠标移动效果,今天小编把我实现的demo分享到脚本之家平台,对Unity UI拖拽相关知识感兴趣的朋友跟随小编一起学习吧
    2021-05-05
  • C#集合类用法实例代码详解

    C#集合类用法实例代码详解

    本文通过实例代码给大家介绍了C#集合类用法的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-10-10
  • C#之HttpClient的同步使用方式

    C#之HttpClient的同步使用方式

    这篇文章主要介绍了C#之HttpClient的同步使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论