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

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

生命可以归结为一种简单的选择:要么忙于生存,要么赶着去死


Test.cs代码:

 internal class Test
    {
        //读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。
        //在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。
        //某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用lock方式加锁,则会影响读取的效率。
        //而如果采用读写锁,则多个线程可以同时读取该对象,只有等到对象被写入锁占用的时候,才会阻塞。
        private static ReaderWriterLockSlim _rw = new ReaderWriterLockSlim();
        private static Dictionary<int, int> _item = new Dictionary<int, int>();

        private static void Read()
        {
            Console.WriteLine("①读取字典的内容");
            while (true)
            {
                try
                {
                    //尝试进入读取模式锁定状态。
                    _rw.EnterReadLock();
                    foreach (var key in _item.Keys)
                    {
                        Console.WriteLine("③读取模式---键 {0} ", key);
                        Thread.Sleep(TimeSpan.FromSeconds(0.1));
                    }
                }
                finally
                {
                    //减少读取模式的递归计数,并在生成的计数为 0(零)时退出读取模式。
                    _rw.ExitReadLock();
                }
            }
        }

        private static void Write(string threadName)
        {
            while (true)
            {
                try
                {
                    int newKey = new Random().Next(250);
                    //可升级读模式,这种方式和读模式的区别在于它还有通过调用 EnterWriteLock 或 TryEnterWriteLock 方法升级为写入模式
                    //因为每次只能有一个线程处于可升级模式。进入可升级模式的线程,不会影响读取模式的线程,即当一个线程进入可升级模式,
                    //任意数量线程可以同时进入读取模式,不会阻塞。
                    //如果有多个线程已经在等待获取写入锁,那么运行EnterUpgradeableReadLock将会阻塞,直到那些线程超时或者退出写入锁。
                    _rw.EnterUpgradeableReadLock();
                    if (!_item.ContainsKey(newKey))
                    {
                        try
                        {
                            //尝试进入写入模式锁定状态
                            _rw.EnterWriteLock();
                            _item[newKey] = 1;
                            Console.WriteLine("②新键 {0} 添加到字典中通过 {1}", newKey, threadName);
                        }
                        finally
                        {
                            //减少写入模式的递归计数,并在生成的计数为 0(零)时退出写入模式。
                            _rw.ExitWriteLock();
                        }
                    }
                    Thread.Sleep(TimeSpan.FromSeconds(0.1));
                }
                finally
                {
                    _rw.ExitUpgradeableReadLock();
                }
            }
        }

        public static void RunTest()
        {
            new Thread(Read) {IsBackground = true}.Start();
            new Thread(Read) {IsBackground = true}.Start();
            new Thread(Read) {IsBackground = true}.Start();

            new Thread(() => Write("线程 1"))
            {
                IsBackground = true
            }.Start();
            new Thread(() => Write("线程 2"))
            {
                IsBackground = true
            }.Start();

            Thread.Sleep(TimeSpan.FromSeconds(30));

            Console.ReadKey();
        }
    }

运行结果如图:

这里写图片描述

【C# & 多线程】多线程中的同步机制。如何安全的读写共享变量。 对于整数类型,还可以使用 Interlocked 类中的Exchange方法,来确保对整数类型的属性的线程安全访问,而无需显式地使用 lock 语句。在多线程环境中,如果没有适当的同步机制,线程之间的交互可能会变得混乱,导致数据不一致、竞态条件等问题。同步的主要目的是控制对共享资源的访问,确保线程之间的正确协作和顺序执行。如果MyProperty属性的get和set访问器都加了lock语句,并且您尝试使 sharedCounter.MyProperty++来增加计数器的值,那么最终的结果可能不是正确。 阅读详情

相关推荐

决胜多线程战场:C#并发锁三巨头Monitor、Mutex与ReaderWriterLockSlim全方位揭秘与实战对决

在C#多线程编程中,为了确保对共享资源的安全访问,防止竞态条件和数据不一致性,我们需要借助各种并发锁机制。本文将详细对比并演示C#中常用的三种并发锁:Monitor、Mutex与ReaderWriterLockSlim,通过代码示例与注释揭示它们的特性和应用场景。它允许多个线程同时读取资源,但在任何时候只允许一个线程写入资源,有效平衡了并发读取和独占写入的需求。注释展示了如何创建、获取(带有超时)和释放Mutex,以同步对共享资源的访问。它提供了对象级别的锁,允许多个线程对同一对象进行同步访问。

java专栏 1094

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

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

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

读写锁ReaderWriterLockSlim测试

读写锁ReaderWriterLockSlim测试

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

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

dotnet研习社 1607

ROS相机内参标定详细步骤指南

相机标定的目的是为了确定相机内部参数和外部参数,以便修正图像并将图像坐标映射到世界坐标,或者从世界坐标映射到图像坐标。这个过程是计算机视觉和三维感知任务的关键步骤之一,它有以下主要目的: 1. **减小畸变**:相机镜头和传感器可能引入径向和切向畸变,使得图像中的直线变得弯曲或者物体的形状不准确。通过标定相机,可以矫正这些畸变,使图像更准确。

m0_56661101的博客 1万+

新手小白如何学习编程

学习目标推荐第一门语言优势网站 / APP 开发(前端)JavaScript浏览器原生支持,能快速做出可视化效果后端 / 服务器 / 数据分析Python语法简洁像英语,库多、应用广(入门友好)游戏开发先用电竞入门,再转专业引擎硬件 / 嵌入式(比如单片机)C 语言贴近硬件,行业标准办公自动化(Excel / 文档处理)Python快速解决重复工作(比如批量改文件)👉新手首选推荐。

2501_94331842的博客 2233

ReaderWriterLockSlim类

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

singhwong 1448

【β-Boltzmann探索策略】

𝜀是一个介于0和1之间的参数,用于控制探索和利用的比例。当𝜀较大时,智能体更倾向于探索;当𝜀较小时,智能体更倾向于利用已知信息。

m0_59385870的博客 1087

C#多线程编程:线程同步

原文链接:https://www.cnblogs.com/wyt007/p/9486752.html 正如前面所看到的一样,多个线程同时使用共享对象会造成很多问题。同步这些线程使得对共享对象的操作能够以正确的顺序执行是非常重要的。在使用C#中的lock关键字,我们遇到了一个叫作竞争条件的问题。导致这问题的原因是多线程的执行并没有正确同步。当一个线程执行递增和递减操作时,其他线程需要依次等待。这种...

lweiyue的专栏 4219

ROS 2实战:用MoveIt Task Constructor让机械臂完成抓取任务(附避坑指南)

本文详细介绍了如何在ROS 2环境中使用MoveIt Task Constructor框架,为Franka Panda机械臂构建一个完整的拾取放置任务流水线。通过分解任务阶段、配置规划器并处理实际部署中的常见问题,帮助开发者从基础运动规划升级到可靠的多步骤任务编排,并附有核心避坑指南。

vvv99的博客 508

Win11实时字幕还能这么玩?手把手教你打造专属‘AI字幕机’,告别视频网站无字幕困扰

本文详细介绍了如何利用Win11的实时字幕功能打造全平台通用的AI字幕系统。通过C#抓取程序、Node.js中转服务和前端展示界面的组合,实现自动抓取系统字幕并实时推送到任意网页视频的方案,有效解决在线视频无字幕的困扰。

weixin_33735077的博客 393

C#多线程同步技术

     我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的线程(Thread)。      线程(Thread)是一份独立运行的程序,有自己专用的运行栈。线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。      当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去

在水一方 5099

Qt图表库三选一:Qwt、QChart、QCustomPlot实战性能对比与避坑指南

本文深入对比了Qt开发中三大主流图表库Qwt、QChart和QCustomPlot的性能与适用场景。通过实测数据展示各库在渲染效率、内存占用和功能特性上的差异,并提供针对不同项目需求的选型建议和集成避坑指南,帮助开发者高效选择最适合的Qt图表解决方案。

weixin_33691700的博客 449

如何使用C#读写锁ReaderWriterLockSlim

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

以梦为马 不负韶华 1712

vLLM专题(七)-支持的模型列表

vLLM支持跨多种任务的生成式和池化模型。如果一个模型支持多个任务,您可以通过–task参数来设置任务。对于每个任务,我们列出了已在vLLM中实现的模型架构。每个架构旁边,我们列出了一些使用该架构的流行模型。

1260

C#与倍福TwinCAT3通信实战:ADS协议封装与设备变量读写完整源码

倍福(Beckhoff)TwinCAT3 作为工业自动化领域主流的软PLC系统,其内置的ADS(Automation Device Specification)协议是实现上位机与TwinCAT3通信的核心标准。传统ADS通信开发存在门槛高(协议细节复杂)、稳定性差(缺乏统一异常处理)、复用性低(重复编码)等问题。本文基于 C# 技术栈,聚焦“协议封装标准化、变量读写易用化、通信稳定工业化”核心需求,提供一套完整的 ADS 协议封装方案与设备变量读写源码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1987

深入理解C#多线程同步:ReaderWriterLockSlim与SpinWait实战解析

通过本文的两个示例,我们深入理解了ReaderWriterLockSlim和SpinWait的工作原理及适用场景。ReaderWriterLockSlim通过读写分离显著提升了高并发读取场景的性能,而SpinWait则提供了更精细的等待控制,减少了不必要的线程阻塞开销。优先考虑更轻量级的同步方式始终保证异常情况下的资源释放通过性能测试验证同步策略的有效性保持同步区域的代码尽可能简短掌握这些多线程同步技术,将帮助你构建出更高性能、更可靠的并发应用程序。

钢铁男儿 908

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# 多线程(2)——线程同步

当在同一时刻多个线程操作共享资源时就会导致数据的错误,但是如果在单一线程中按照顺序就不出现这样的问题,这也就引申出线程同步的内容,保证多个线程提升性能的前提下,也不会出现程式数据的错误,重点就是让多个线程按照一定的顺序同步的执行代码,就是线程同步的概念。lock 排它锁的使用,确保了多个线程在访问竞态代码块时,只有一个线程是获得CPU时间片的,其他的线程处于阻塞中,并处于一个等待队列中。直到锁被释放,等待的线程属于先到先得的情形,依次等待获得锁去执行竞态代码块,保证了线程同步,因此可以保证线程的安全。

contact97的博客 2124

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# 中多线程间的同步

一、引入先给出一个Num类的定义internalclassNum { publicstaticintodd=50000; publicstaticinteven=10000; }假设现在要求输出小于 odd 的所有奇数,输出小于 even 的所有偶数,不考虑多线程时可以写出如下的代码:(为了演示多线程时线程间的争用,先把值赋给了 num,实际上这个赋值操作毫无...

weixin_68436326的博客 1041

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# 多线程锁之ReaderWriterLockSlim

1、简介 .NET 3.5 开始 ReaderWriterLockSlim登上舞台,ReaderWriterLockSlim 可以看做是 ReaderWriterLock 的升级版。 由于 ReaderWriterLockSlim 默认不支持递归调用、所以在某种意义上来说更不容易造成死锁。ReaderWriterLockSlim 类支持三种锁定模式:Read,Write,UpgradeableR...

weixin_33922670的博客 410

C#多线程编程笔记(2.7)-使用ReaderWriterLockSlim类

近来在学习Eugene Agafonov编写的《C#多线程编程实战》(译),做些笔记也顺便分享一下^-^using System; using System.Collections.Generic; using System.Threading; namespace ReaderWriterLockSlim_Test { class Program { stati...

轩阳俊的博客 1万+

C# 线程同步(使用ReaderWriterLockSlim类)

本节将描述如何使用ReaderWriterLockSlim来创建一个线程安全的机制,在多线程中对一个集合进行读写操作。ReaderWriterLockSlim代表了一个管理资源访问的锁,允许多个线程同时读取,以及独占写。运行结果。

钢铁男儿 286

在.Net框架中 C# 实现多线程的同步方法详解

本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,实现线程同步主要通过以下的几种方式来实现,在MSDN的线程指南中已经讲了几种,本文结合作者实际中用到的方式一起说明一下。 维护自由锁(InterLocked)实现同步 监视器(Monitor)和互斥锁(lock) 读写锁(ReadWr...

极客神殿 1455

ReaderWriterLockSlim vs 其他同步机制:C#多线程编程该如何选择?

本文深入比较了C#中ReaderWriterLockSlim与其他线程同步机制(如Monitor、Mutex和ConcurrentDictionary)的性能与适用场景。通过基准测试数据和实际代码示例,分析了不同读写比例下的最佳选择策略,帮助开发者在多线程编程中优化性能与资源使用。

weixin_30329623的博客 310
上一篇: C#多线程同步(七)【Barrier】
下一篇: C#多线程同步(九)【volatile】
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值