首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果锁定C#有类似的RAII行为?

如果锁定C#有类似的RAII行为?
EN

Stack Overflow用户
提问于 2019-12-14 23:10:16
回答 2查看 403关注 0票数 1

有点让人费解。在用于多线程管理的C#中,我们有互斥锁,也有锁,此外,我还找到了这样的lock RAII实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public class ReaderWriterLockSlim_ScopedLockRead : IDisposable
        {
            ReaderWriterLockSlim m_myLock;

            public ReaderWriterLockSlim_ScopedLockRead(ReaderWriterLockSlim myLock)
            {
                m_myLock = myLock;
                m_myLock.EnterReadLock();
            }

            public void Dispose()
            {
                m_myLock.ExitReadLock();
            }
        }

        public class ReaderWriterLockSlim_ScopedLockWrite : IDisposable
        {
            ReaderWriterLockSlim m_myLock;

            public ReaderWriterLockSlim_ScopedLockWrite(ReaderWriterLockSlim myLock)
            {
                m_myLock = myLock;
                m_myLock.EnterWriteLock();
            }

            public void Dispose()
            {
                m_myLock.ExitWriteLock();
            }
        }
    }

我想了解它们之间的区别,因为对我来说,互斥是第一个多线程管理实现--您需要调用mutex.lock(),然后不要忘记调用mutex.release() --通常不太适合调用mutex.release(),因为在执行过程中可能会出现错误,所以在我看来,它是一种具有相同行为的RAII对象,但是如果在中间得到错误,它就会调用mutex.release(),一切都很好。

但是我上一次发布的定制工具呢?与lock(obj){}类似,只是我们有一个不同的read and write行为,比如在写状态下,有几个线程有可能一个接一个地访问方法和读状态.

我就在这儿吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-15 01:52:59

因此,对于锁定,重要的是获得的每个锁也被释放(不管它锁定的代码是否有任何异常)。因此,通常情况下,不管您使用什么锁,它看起来都是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myLock.MyAcquireMethod();
try
{
    //...
}
finally
{
    myLock.MyReleaseMethod();
}

现在,对于Monitorc#中的锁定机制,它们有一个关键字来使它更容易:lock

它基本上将获取和发布封装在一个lock代码块中。

所以这个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lock(myObj)
{
    //...
}

只是一种更方便的书写方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Monitor.Enter(myObj);
try
{
    //...
}
finally
{
    Monitor.Exit(myObj);
}

遗憾的是,对于其他锁(而且由于Monitor有它的局限性,我们并不总是想使用它),我们没有这么简单的方法来完成整个工作,并且为了解决这个问题,ReaderWriterLockSlim_ScopedLockRead包装器实现了为您提供这个try finally机制的IDisposable (using还保证不管代码运行是否完成或出现异常,Dispose()都会在IDisposable上被调用)。

因此,与其:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
m_myLock.EnterWriteLock();
try
{
    //...
}
finally
{
    m_myLock.ExitWriteLock();
}

你现在可以这么做了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using(new ReaderWriterLockSlim_ScopedLockRead(m_myLock))
{
    //...
}

希望这能回答你的问题!

作为奖励,对Monitorc#发出警告。这种锁定机制是线程级上的可重入机构.这意味着允许持有锁的线程多次获取锁(尽管它还必须多次释放锁),这允许您执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private readonly object _myLock = new object();

public void MyLockedMethod1()
{
    lock(_myLock)
    {
        MyLockedMethod2();
    }
}

public void MyLockedMethod2()
{
    lock(_myLock)
    {
        //...
    }
}

因此,无论是直接调用MyLockedMethod2还是通过MyLockedMethod1调用(这可能也需要其他东西的锁),您都可以具有线程安全性。

然而,现在很多人使用async/await,其中一个方法可以在另一个线程上继续使用,如果获得它的线程不是释放它的线程,它可以破坏Monitor,所以我建议您不要使用这样的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public async Task MyLockedMethod()
{
    lock(_myLock)
    {
        await MyAsyncMethod();
    }
}

无论如何,如果您想了解更多的话,这里有很多关于这方面的文档。

票数 1
EN

Stack Overflow用户

发布于 2019-12-15 00:41:29

根本不是这样的。读写锁是特定上下文中使用的实现。

  • 所有的人都可以在任何时候阅读,而不是一个阻塞另一个,而是阻止任何想要写作的人。
  • 那个时候连一个字都不会读或写。

它与维基百科在这里描述了它完全一样,不特定于C#或任何其他语言。这只是ReadWriter锁的ReadWriter风格

是一个同步原语,它解决了读者-作者的问题之一。RW锁允许并发访问只读操作,而写操作则需要独占访问.

检查有关更多信息,请参阅Microsoft文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59341902

复制
相关文章
C# Monitor:锁定资源
C#中, 通过System.Threading.Monitor类可以实现多线程中对某些代码块的同步访问,以确保数据的安全性。
zls365
2020/08/19
9020
C# Monitor:锁定资源
如果Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?
方法一:Controller中注入service的时候使用@Autowired自动注入,@Qualifier("beanId")来指定注入哪一个。
Java旅途
2021/06/08
2.4K0
聊聊RAII
RAII(Resource Acquisition Is Initialization),全称资源获取即初始化,1984-1989年期间,比雅尼·斯特劳斯特鲁普和安德鲁·柯尼希在设计C++异常时,为解决资源管理时的异常安全性而使用了该用法,后来比雅尼·斯特劳斯特鲁普将其称为RAII
雪月清
2023/10/25
1990
聊聊RAII
C#类
C#是面向对象的语言,它使用类来进行抽象。在C#里,把类之中的变量统称为“数据成员”;类的函数称为“方法”。它的类基本和C++的是相似的。下面是一个非常简单的类。
zy010101
2019/05/25
7820
C++核心准则R.1: 使用资源句柄自动管理资源并RAII(资源获取即初始化)
To avoid leaks and the complexity of manual resource management. C++'s language-enforced constructor/destructor symmetry mirrors the symmetry inherent in resource acquire/release function pairs such as fopen/fclose, lock/unlock, and new/delete. Whenever you deal with a resource that needs paired acquire/release function calls, encapsulate that resource in an object that enforces pairing for you -- acquire the resource in its constructor, and release it in its destructor.
面向对象思考
2020/03/25
7700
RAII_ras raf
大家好,又见面了,我是你们的朋友全栈君。 http://baike.baidu.com/link?url=DUGlzCMqyZ2aInTkdpGWqW0f53fL-LWLu9nD3rGoJClIU
全栈程序员站长
2022/11/01
4040
C#工具类:DotNet C# 工具类库项目
说起来,我是一个DotNet的初学者,刚刚上手,到处找比较适合我这种刚入门水平的开源项目。在Gitee上我无意中碰到了一个值得向各位初学者推荐的入门项目。
开源指北
2022/12/26
1.2K0
C#工具类:DotNet C# 工具类库项目
C#——Directory类
Directory 文件夹 目录 创建文件夹 Directory.CreateDirectory(@"C:\Users\H0772690\Desktop\a"); 删除文件夹 Directory.Delete(@"C:\Users\H0772690\Desktop\a"); 剪切到指定地址 Directory.Move(@"C:\Users\H0772690\Desktop\a", @"C:\Users\H0772690\Documents\1
用户9857551
2022/06/28
5990
c#类(class)
类的定义是以关键字class开始的,后面跟类的名称,类的主题包含一个花括号里,下面是类定义的一般格式。
酱紫安
2020/07/21
6800
C# FileStream类
FileShare 枚举类型主要用于设置多个对象同时访问同一个文件时的访问控制,具体的枚举值如下。
全栈程序员站长
2022/09/15
7190
C#委托 如果委托发生异常事件
假如在写游戏,有一个人物,他会升级,那么在他升级的时候,需要给他添加潜力值,而判断升级是经验类需要写的。
林德熙
2018/09/18
1.4K0
dotnet Blazor 用 C# 控制界面行为
微软很久就在做 Blazor 但是我现在才开始创建一个测试项目,我想用 C# 去控制 HTML 界面。小伙伴也许会问现在前端不是烂大街么,为什么还需要 Blazor 来做。可能原因只有一个,就是可以使用 C# 写脚本,代码比较清真
林德熙
2022/08/04
7620
dotnet Blazor 用 C# 控制界面行为
如果串口驱动有问题,怎么调
a. 编译: arm-linux-gcc -o serial_test serail_test.c -static b. 在开发板上运行: ./serial_test </dev/XXX> // /dev/XXX为串口的设备节点
韦东山
2020/09/30
1.5K0
C++核心准则E.25:如果不能抛出异常,模仿RAII方式进行资源管理
Even without exceptions, RAII is usually the best and most systematic way of dealing with resources.
面向对象思考
2020/08/10
6040
内存管理之堆、栈、RAII
最近在极客时间上看到吴老师的《现代C++实战30讲》,觉得很是不错,于是学习一下,本文中的一些文字概念引用自这里。同时,对于这个课的代码我放在了我的《C++那些事》仓库里面,点击阅读原文,或者下面链接,即可获取。欢迎star!
公众号guangcity
2019/12/16
1.1K0
内存管理之堆、栈、RAII
转:上网行为管理系统有哪些
让我们想象一个场景:一家大型企业的员工们在网络上分享大量敏感信息,同时还向外网提供服务。现在,我们想要确保网络资源得以有效利用的同时又不引发风险,那么该如何规避风险的同时确保网络资源的有效使用呢?这时上网行为管理系统就该派上用场了。那么,下面列举一些网络上有哪些好用的上网行为管理系统:
啵啵鳐
2023/10/12
4120
C++11/14/17中mutex系列区别
以上系列的对象都提供了加锁(lock)、尝试加锁(try_lock)和解锁(unlock)方法。
音视频牛哥
2022/06/16
1.2K0
设计模式之行为类模式PK
策略模式和命令模式相似, 特别是命令模式退化时,比如无接收者(接收者非常简单或者接收者是Java的基础操作,无需专门写一个接收者), 这种情况下, 命令模式和策略模式的类图完全一样. 但是两者还是有区别的:
烟草的香味
2019/07/25
4100
叶子相似的树
举个例子,如上图所示,给定一颗叶值序列为(6, 7, 4, 9, 8)的树。 如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是叶相似的。 如果给定的两个头结点分别为root1和root2的树是叶相似的,则返回true;否则返回false 。
WindRunnerMax
2020/08/27
4410
如果疫情防控有「零信任」技术
疫情防控太难了,即使严格按照规定动作来做,病例还是一波接一波。 想来也是,因为: 在验证“你是健康的”环节: 核酸的结果不是马上就出来的,核酸检测达不到实时,为了平衡工作生活,只能要求一段时间内有核酸,现在大部分都是48小时,因为连24小时都会产生诸多不便。 核酸的检测准确性受制因素太多,采样位置、时间、病情轻重等都受影响。 所以,技术上其实没办法证明你现在/当下就是健康的。 在隔离阻断环节: 低风险的区域内部是默认信任的,一旦有病例,很容易造成传播。 不同风险区域之间的身份核实比较难,唯一的技术手段是
数说君
2022/08/25
3910

相似问题

RAII锁定条件

16

RAII类设计

20

锁定C#:奇怪的行为

15

与RAII相似的惯用短寿命局部物体

12

boost::scoped_lock RAII行为

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文