码迷,mamicode.com
首页 > 其他好文 > 详细

使用ReaderWriterLock类实现多用户读/单用户写同步

时间:2015-03-12 16:49:26      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

使用ReaderWriterLock类实现多用户读/单用户写同步[1]

2015-03-12

应用程序在访问资源时是进行读操作,写操作相对较少。为解决这一问题,C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景。

该类可实现以下功能:如果资源未被写操作锁定,那么任何线程都可对该资源进行读操作锁定,并且对读操作锁数量没有限制,即多个线程可同时对该资源进行读操作锁定,以读取数据。如果资源未被添加任何读或写操作锁,那么一个且仅有一个线程可对该资源添加写操作锁定,以写入数据。简单的讲就是:读操作锁是共享锁,允许多个线程同时读取数据;写操作锁是独占锁,同一时刻,仅允许一个线程进行写操作。

代码如下:

 1 using System;
 2 using System.Threading;
 3 
 4 namespace ProcessTest
 5 {
 6     class Program
 7     {        
 8         //读、写操作锁
 9         static ReaderWriterLock rwl = new ReaderWriterLock();
10 
11         static void Main(string[] args)
12         {
13             //分别创建2个读操作线程,2个写操作线程,并启动
14             Thread tr0 = new Thread(new ParameterizedThreadStart(Read));
15             Thread tr1 = new Thread(new ParameterizedThreadStart(Read));
16             Thread tr2 = new Thread(new ParameterizedThreadStart(Write));
17             Thread tr3 = new Thread(new ParameterizedThreadStart(Write));
18 
19             tr0.Start("R0");
20             tr1.Start("R1");
21             tr2.Start("W2");
22             tr3.Start("W3");
23 
24             //等待线程执行完毕
25             tr0.Join();
26             tr1.Join();
27             tr2.Join();
28             tr3.Join();
29 
30             System.Console.ReadKey();
31         }
32 
33         //读数据
34         static void Read(object state)
35         {
36             for (int i = 0; i < 3; i++)
37             {
38                 try
39                 {
40                     //申请读操作锁,如果在1000ms内未获取读操作锁,则放弃
41                     rwl.AcquireReaderLock(1000);
42                     Console.WriteLine("Begin Read,Thread = {0}", state);
43                     Thread.Sleep(10);
44                     Console.WriteLine("End Read,Thread = {0}", state);
45                     //释放读操作锁
46                     rwl.ReleaseReaderLock();
47                 }
48                 catch (ApplicationException)
49                 {
50                     //获取读操作锁失败的处理
51                 }
52             }
53         }
54 
55         //写数据
56         static void Write(object state)
57         {
58             for (int i = 0; i < 3; i++)
59             {
60                 try
61                 {
62                     //申请写操作锁,如果在1000ms内未获取写操作锁,则放弃
63                     rwl.AcquireWriterLock(1000);
64                     Console.WriteLine("Begin write,Thread = {0}", state);
65                     Thread.Sleep(100);
66                     Console.WriteLine("End write,Thread = {0}", state);
67                     //释放写操作锁
68                     rwl.ReleaseWriterLock();
69                 }
70                 catch (ApplicationException)
71                 {
72                     //获取写操作锁失败
73                 }
74             }
75         }
76     }
77 }

结果如下:

技术分享

 

参考:

[1] C#多线程编程之:使用ReaderWriterLock类实现多用户读/单用户写同步

[2] 归纳一下:C#线程同步的几种方法

使用ReaderWriterLock类实现多用户读/单用户写同步

标签:

原文地址:http://www.cnblogs.com/Ming8006/p/4332808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!