欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-29 10:49:19
本文实例讲述了c#多线程编程之使用readerwriterlock类实现多用户读与单用户写同步的方法。分享给大家供大家参考,具体如下: 摘要:c#提供了system.th...

本文实例讲述了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个写入线程,交替进行读、写操作。运行结果如下图:

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

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

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

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