读写锁操作(ReaderWriterLockSlim)

C# ReaderWriterLockSlim 类 使用详解 阅读详情

    
(1)

static void WriterMethod(object writer)
{
    Console.WriteLine("Writer {0} acquired the lock", writer);
    for (int i = 0; i < items.Count; i++)
    {
        items[i]++;
        Console.Write(items[i]);
    }
    Console.WriteLine("");
    Console.WriteLine("Writer {0} finished", writer);
}

private static List<int> items = new List<int>() { 0, 1, 2, 3, 4, 5 };

static void Main()
{
    WriterMethod(0);
    WriterMethod(1);

}

image
没问题
(2)换成线程
for (int i = 0; i < 2; i++)
{
    Thread a = new Thread(WriterMethod);
    a.Start(i);
}

顺序出错了
image

(3)使用读写锁操作ReaderWriterLockSlim
使用EnterWriteLock锁定写操作,恢复正常,必须手动退出锁模式,否则将会永远独占ExitWriteLock

  static void WriterMethod(object writer)
  {
      rwl.EnterWriteLock();
      Console.WriteLine("Writer {0} acquired the lock", writer);
      for (int i = 0; i < items.Count; i++)
      {
          items[i]++;
          Console.Write(items[i]);
      }
      Console.WriteLine("");
      Console.WriteLine("Writer {0} finished", writer);
      rwl.ExitWriteLock();
  }
  private static ReaderWriterLockSlim rwl = new
ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);


(4)设置锁超时时间
使用Try方法是可以设置锁时间,如果超时的话,则继续执行,但此时则未进入锁定状态,无法用ExitWriteLock退出,可以用
RecursiveWriteCount属性来判断

static void WriterMethod(object writer)
{
    rwl.TryEnterWriteLock(50);
    Console.WriteLine("Writer {0} acquired the lock", writer);
    for (int i = 0; i < items.Count; i++)
    {
        items[i]++;
        Console.Write(items[i]);
        Thread.Sleep(50);
    }
    Console.WriteLine("");
    Console.WriteLine("Writer {0} finished", writer);
    if(rwl.RecursiveWriteCount>0)
    rwl.ExitWriteLock();
}
结果照样混乱
image

(5)读写操作(单一执行)

读写操作同时进行
for (int i = 0; i < 2; i++)
{
    Thread a = new Thread(WriterMethod);
    Thread b = new Thread(ReaderMethod);
    b.Start(i);
    a.Start(i);
    
}

static void ReaderMethod(object reader)
{

    for (int i = 0; i < items.Count; i++)
    {
        Console.WriteLine("reader {0}, loop: {1}, item: {2}",
              reader, i, items[i]);
       
    }
    }

结果是混乱的,无法预测

image

进入读操作

static void ReaderMethod(object reader)
{
    rwl.EnterReadLock();
    for (int i = 0; i < items.Count; i++)
    {
        Console.WriteLine("reader {0}, loop: {1}, item: {2}",
              reader, i, items[i]);
     
    }
    rwl.ExitReadLock();
   
}

现在读写操作是单一执行的,不可能同时处于读写状态
image
同样EnterReadLock也有Try方法


另外参见
http://www.cnblogs.com/lucifer1982/archive/2008/12/07/1349437.html

读写锁ReaderWriterLockSlim测试 立即下载

相关推荐

ZYNQ双核通信实战:手把手教你用OpenAMP搭建Linux+FreeRTOS开发环境(2018.3版)

本文详细介绍了如何在ZYNQ平台上使用OpenAMP框架实现双核通信,构建Linux与FreeRTOS协同开发环境。从开发环境配置、系统组件编译到OpenAMP框架应用,手把手指导开发者完成ZYNQ双核通信系统的搭建与调试,为异构计算开发提供实用解决方案。

weixin_33737134的博客 476

C#多线程系列之读写锁-ReaderWriterLockSlim 类

EnterReadLock() 使用 EnterUpgradeableReadLock() 进入升级状态,在恰当时间点 通过 EnterWriteLock() 进入写模式。线程创建订单时是没有设置 Thread.Sleep() 的,因此运行速度十分快。因为理论的东西,笔者这里不会说太多,主要就是先掌握一些 API(方法、属性) 的使用,然后简单写出示例,后面再慢慢深入了解底层原理。EnterWriteLock() / TryEnterWriteLock() 和 ExitWriteLock() 成对出现。

这个人好有趣....hh 3250

基于深度学习的时间序列预测

深度学习在时间序列数据中应用广泛,学术界已经有很多深度学习模型来适应不同领域的时间序列数据集的多样性。那么到底有哪些基于深度学习的时间序列预测模型?他们的优缺点是什么?让我们一起来看一下。

Sharon0408的博客 6580

探讨ReaderWriterLockSlim用法:提高多线程性能的利器

在多线程编程中,确保数据的一致性和线程安全是至关重要的。在处理共享数据时,锁(Lock)是保证线程安全的一种常见方法。C# 提供了多种锁机制,ReaderWriterLockSlim 是其中一个用于解决读写共享资源时的性能问题的非常有用的类。本文将深入探讨 ReaderWriterLockSlim 的用途、工作原理及其应用场景。是 C# 中非常强大且高效的并发控制工具。它特别适用于读多写少的场景,通过允许多个线程并发读共享数据,而在写操作时提供独占的写锁,极大地提高了程序的并发性和性能。

dotnet研习社 1607

手把手教你用Apple Developer App完成苹果开发者账号注册(含证件验证失败解决方案)

本文详细指导如何通过Apple Developer App完成苹果开发者账号注册,特别针对证件验证失败问题提供解决方案。从准备工作到注册流程,再到验证失败的处理方法,帮助开发者顺利完成注册,避免常见错误。

moss5的博客 1156

phpstudy自定义安装mysql8.3并启动

下载压缩包文件然后按下面的图片一步一步操作选择版本,选择第一个压缩包文件,下载下载完成后,解压到phpstudy环境目录下

互联网碎碎念 2802

ReaderWriterLockSlim类

为了使锁定机制允许锁定多个读取器(而不是一个写入器)访问某个资源,可以使用ReaderWriterLockSlim类。这个类提供了一个锁定功能,如果没有写入器锁定资源,就允许多个读取器访问资源,但只能有一个写入器锁定该资源。 ReaderWriterLockSlim类有阻塞或不阻塞的方法来获取读取锁,如阻塞的EnterReadLock()和不阻塞的TryEnterReadLock()方法,还可以使用阻塞的EnterWriteLock()和不阻塞的TryEnterWriteLock()方法获得写入锁定。如果

singhwong 1447

Adams中AKISPL和DX函数的妙用:打造精准的非线性衬套模型

本文深入探讨了在Adams动力学软件中,如何巧妙运用AKISPL插值函数与DX等位移测量函数,构建高精度的非线性衬套模型。文章通过实战案例,详细解析了从单轴非线性刚度到完整六自由度耦合模型的实现步骤与调试技巧,帮助工程师将复杂的实验或有限元数据转化为可靠的多体动力学仿真模型,有效提升系统仿真置信度。

sky77的博客 318

ReaderWriterLockSlim的双重检查三重锁定模式

某些项目会因upgradeable-read-lock使用不当而受到影响。如果所有情况都涉及获取可升级的读锁以升级到写锁,而从未使用过简单的读锁,则会出现不必要的争用,这比使用带有lock关键字的完全锁更糟糕。

寒冰屋的专栏 340

西门子精致面板TP1200 历史数据(历史数据、审计追踪) 移存到网络路径

TP1200 审计追踪

zhang080602的博客 5769

[明道云] -基础教学5- 明道云 40 种控件详解与场景解析

明道云工作表提供40种业务控件,涵盖文本、数值、关联、公式等类型,支持各类业务场景。文本类支持多行输入、正则校验;数值/金额类提供进度条、百分比显示等功能;关联类实现多表数据引用;公式/函数类支持复杂逻辑运算;自动化类包括打印模板、API调用等控件。合理使用这些控件可提升数据收集质量和自动化效率,同时需注意控件联动的性能影响和权限配置。关键控件包括关联记录、级联选择、公式计算等,适用于订单管理、客户信息关联等业务场景。

每日出拳老爷子的博客 8541

如何使用C#读写锁ReaderWriterLockSlim

这篇文章向大家介绍了读写锁ReaderWriterLockSlim,其优点就是多个线程可以同时读取该对象,要了解更多读写锁的知识,仔细阅读下文吧 读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。 某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用lock方式加锁,则会影响读取的效率。而如果采用读写锁,则多个线程可以同时读取该对象,只有等到对象被写入锁占用的

以梦为马 不负韶华 1712

13、离散时间系统建模与分析

本文系统介绍了离散时间系统的建模与分析方法,涵盖连续时间模型的离散化过程、系统稳定性判断准则、输入输出模型转换方法以及有限脉冲响应和阶跃响应模型的应用。通过多个示例详细展示了不同系统在离散化过程中的特性变化,并探讨了采样间隔对系统动态特性的影响。此外,文章还分析了时间延迟的处理方法,并总结了关键知识点及操作步骤,为离散时间系统的实际应用提供了理论基础和实践指导。

2w3e4r5t6y的博客 189

多线程 锁 中 读写锁 升级锁 模式初探

public partial class LockTest : Form { public LockTest() { InitializeComponent(); } private void LockTest_Load(object sender, EventArgs e) ...

chencong2005100的博客 634

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

多线程中的锁系统(二)-volatile、Interlocked、ReaderWriterLockSlim

     上章主要讲排他锁的直接使用方式。但实际当中全部都用锁又太浪费了,或者排他锁粒度太大了,本篇主要介绍下升级锁和原子操作。 阅读目录 volatile Interlocked ReaderWriterLockSlim volatile 简单来说volatile关键字是告诉c#编译器和JIT编译器,不对volatile标记的字段做任何的缓存。确保字段读写都是原子操作,最新值...

weixin_34161032的博客 225

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

基于 COM 口(串口,Serial Port)同一时刻只能被一个操作访问的性质,确实可以使用读写锁(ReaderWriterLockSlim)来管理多线程对 COM 口的访问,但需要仔细分析其适用性

基于 COM 口(串口,Serial Port)同一时刻只能被一个操作访问的性质,确实可以使用读写锁(ReaderWriterLockSlim)来管理多线程对 COM 口的访问,但需要仔细分析其适用性和实现方式。2. 串口独占访问:使用互斥锁由于 COM 口同一时刻只能访问一次,使用 SemaphoreSlim(限制一个线程访问)或 lock 是更自然的选择。以下是详细解释、案例代码以及测试示例,结合串口的独占特性、C# 的异步编程和线程同步机制。代码示例:结合读写锁管理串口数据csharp。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 835

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c# 读写锁

//在这个例子中,我们使用了"ReaderWriterLockSlim"类来实现读写锁。 //"EnterReadLock"方法获取读锁,"ExitReadLock"方法释放读锁。 //"EnterWriteLock"方法获取写锁,"ExitWriteLock"方法释放写锁。 //在"GetValue"方法中,我们获取了读锁,然后返回共享资源的值。 //在"SetValue"方法中,我们获取了写锁,然后设置共享资源的值。 //这样,多个线程可以同时读取共享资源,但只有一个线程可以写入共享资源。 //需要注意

weixin_39926429的博客 2207

C#多线程同步(八)【ReaderWriterLockSlim】

生命可以归结为一种简单的选择:要么忙于生存,要么赶着去死Test.cs代码: internal class Test { //读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。 //在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。 //某些场合下,对一个对象的

极客神殿 2249

一文带你了解.Net读写锁

本文主要讲解.Net基于ReaderWriterLockSlim讲解读写锁 基础概念 读写锁是一个具有特殊用途的线程锁,适用于频繁读取且读取需要一定时间的场景,共享资源的读取操作通常是可以同时执行的, 普通的互斥锁不管是获取还是修改操作无法同时执行,如果多个线程为了读取操作而获取互斥锁,那么同一时间只有一个线程可以执行读取操作, 频繁读取的场景下回对吞吐量造成影响 读写锁把锁分为读取锁和写入锁,线程可以根据对共享资源的操作类型获取读取锁还是写入锁,读取锁可以被多个线程同时获取,写入锁不可以被多个线程 .

初夏的阳光 327

对资源加读写锁的容器

之前写了一篇《对不能用using的成对操作,快速扩展IDisposable的方法》提到了如何快速的把销毁操作用闭包的形式封装为IDisposable,并且实现了一个ReaderWriteerLockSlimHelper。 对于没有using的RWLock似乎已经很好用了, 但是我仍嫌弃其不够简单。 资源读写锁的应用,绝大多数是针对某批特定的资源。如果为这样的资源做一个封装,资源的引...

weixin_30588827的博客 122

.NET 同步与异步之锁(ReaderWriterLockSlim)(八)

本随笔续接:.NET 同步与异步之锁(Lock、Monitor)(七) 由于锁 ( lock 和 Monitor ) 是线程独占式访问的,所以其对性能的影响还是蛮大的,那有没有一种方式可是实现:允许多个线程同时读数据、只允许一个线程写数据呢?答案是肯定的。 读写锁ReaderWriterLock、就是 支持单个写线程和多个读线程的锁。自.NET 3.5 开始ReaderWri...

weixin_34281537的博客 238
上一篇: 非递归遍历
下一篇: 如何用PV原语实现进程间的互斥与同步(转载)
clingingboy
博客等级 码龄21年 38粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值