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

使用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#线程同步的几种方法

时间: 2024-10-05 09:42:56

使用ReaderWriterLock类实现多用户读/单用户写同步的相关文章

C#多线程:使用ReaderWriterLock类实现多用户读/单用户写同步

C#多线程:使用ReaderWriterLock类实现多用户读/单用户写同步 - mile - 博客园http://www.cnblogs.com/lhws/archive/2014/03/31/3636757.html 摘要:C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景.该类可实现以下功能:如果资源未被写操作锁定,那么任何线程都可对该资源进行读操作锁定,并且对读操作锁数量没有限制,即多个线程可同时对该资源进行读操作锁定,以读取数据

c++ 多个线程读一个线程写同步

这种情况一般多个线程读是不需要加锁的.就在写的时候需要加锁. 那么要做的就是让不写的时候,读不受同步限制.让多线程自由的读. 这个时候就要用读写锁 boost已经有读写锁,而c++ 14才有读写锁. std::shared_mutex write; //use boost's or c++14 // One write, no reads. void write_fun() { std::lock_guard<std::shared_mutex> lock(write); // DO WRIT

SQLSERVER 切换数据库为单用户和多用户模式

有时候数据库在占用时,想做一些操作,无法操作.可以尝试将数据库切换为单用户模式来操作.操作完之后再切换回多用户模式. 命令如下: alter database 数据库名 set Single_user  --单用户alter database 数据库名 set multi_user   --多用户 或者 sp_dboption 数据库名,"single user",true  --单用户 sp_dboption 数据库名,"single user",false  -

centos 单用户登录

1.按e 编辑 2.修改启动配置,增加 init=/bin/sh 后按ctrl+x键 进入单用户模式 Ctrl+x 执行进入单用户 修改完毕后可以 执行 exec  /sbin/init 进入多用户模式 单用户模式下,很多命令需要添加绝对路径才能执行. 例如: /sbin/fdisk 单用编辑不了 fatab文件可以使用 mount -o remount,rw / 原文地址:https://www.cnblogs.com/caonw/p/11669846.html

什么是多用户操作系统(多用户操作系统和单用户操作系统的区别)

多用户操作系统指的是什么?多用操作系统包括哪几大操作系统?多用户操作系统和单用户操作系统的最大区别在哪里?今天就来为大家讲解什么是多用户操作系统,让大家更加了解电脑这方面的基础知识. 一.什么是多用户? 当然想知道多用户操作系统的话,先了解什么是多用户,什么是单用户,这里还是以电脑系统为例,多用户就是多个用户在一台电脑上可以建立多个用户,对于windows 7系统就是多用户.而如果1台电脑只能使用一个用户的话,就称之为单用户,比如win98就是单用户. 二.多用户操作系统的含义: 多任务操作系统

Linux 7个运行级别(0:关机,停机模式、1:单用户模式、2:多用户模式、3:完整的多用户文本模式、4:系统未使用,保留一般不用、5:图形化模式、6:重启模式)、重置root密码方法

init是Linux系统操作中不可缺少的程序之一.init进程,它是一个由内核启动的用户级进程.内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init.如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败. Linux 7个运行级别(0:关机,停机模式.1:单用户模式.2:多用户模式.3:完整的多用户文本模式.4:系统未使用,保留一般不用.5:图形化模式.6:重启模式),运行级就是操作系统当前正在运行的功能级别.

linux基础:4、linux运行级别、单用户模式、救援模式

linux运行级别 含义:指的是Unix或Linux等类Unix操作系统下不同的运行模式.运行级别通常分为7等,分别是从0到6 ================================================================================== [[email protected] ~]# tail /etc/inittab # Default runlevel. The runlevels used are: #   0 - halt (Do N

CentOS单用户模式下修改ROOT密码和grub加密

Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时,就需要进入单用户模式或修复模式对系统进行管理了. 使用单用户模式有一个前提,就是您的系统引导器(grub)能正常工作,否则要进行系统维护就要使用修复模式. 特注:进入单用户模式,没有开启网络服务,不支持远程连接 Linux 系统中不同的运行级别(Run Level)代表了系统的不同运行状态,例如

centos单用户模式:修改ROOT密码和grub加密

centos单用户模式:修改ROOT密码和grub加密 CentOSLinux网络应用配置管理应用服务器 Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时,就需要进入单用户模式或修复模式对系统进行管理了. 使用单用户模式有一个前提,就是您的系统引导器(grub)能正常工作,否则要进行系统维护就要使用修复模式.特注:进入单用户模式,没有开启网络服务