问题标签 [readerwriterlockslim]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ASP.NET 缓存锁机制
使用 .NET 3.5。我使用ReaderWriterLockSlim将客户对象存储在缓存中。问题是当来自客户 A的用户正在执行将导致更新缓存中的客户对象的操作时;EnterWriteLock()将临时阻止所有用户从缓存中读取客户对象,即使他们可能属于客户 B并且具有不同的客户对象。
c# - 为什么使用 ReaderWriterLockSlim 不能使我的 Dictionary 线程安全?
我编写了一小段代码,可以从多个线程快速读取和写入字典。我使用 ReaderWriterLockSlim 来保护代码,但仍因涉嫌尝试添加重复密钥而收到异常。
请注意,没有线程的确切代码可以完美执行。
c# - ReaderWriterLockSlim 是正确的选择吗?
我正在为在 Windows Azure 中运行的应用程序编写一个全局错误处理程序/记录器。当应用程序中发生错误时,会执行许多需要以原子方式发生的操作。我需要防止在前一个错误完成之前记录错误。同时,我希望根据需要读取日志。
我最初的想法是使用监视器/锁定并仅锁定错误写入。这样,读取根本不会受到抑制。我想知道 ReaderWriterLockSlim 是否更合适。我不能说我真正理解一种方法与另一种方法之间的价值。
我是否应该创建一个 ReaderWriterLockSlim 并执行以下操作(读取包含在 EnterReadLock 中)...
还是我只是简单地执行以下操作,仅锁定写入部分:
任何想法/建议将不胜感激。
c - Windows 条件变量与事件
我们可以使用新的条件变量原语或 windows 事件来同步 WinNT v6.x 或更高版本中的线程。考虑以下两种方法,我们希望worker在main中设置“go”时同时运行,否则它们都应该阻塞。
或者
在第一种方法中,工作人员在SleepConditionVariableSRW上被阻止并被WakeAllConditionVariable唤醒。其次,它们在WaitForSingleObject上被阻塞并被SetEvent唤醒。
哪一个在实践中更好,仅关于开销?(提示:上下文切换、锁竞争、阻塞线程的开销)
我会选择第一个,但觉得缺乏理由。
c# - 使用 ReaderWriterLock 的真正缺点是什么
我们有针对 .NET 2.0 RTM 的项目(是的,它应该是 .NET 2.0 RTM,我们有一些正统的客户端)。我只是想知道ReaderWriterLock的缺点是什么?为什么每个人都说“不要使用它,尝试使用其他类似lock
声明”的东西如此糟糕?如果我们可以使用 .NET 3.5,我肯定会使用ReaderWriterLockSlim,但ReaderWriterLock
我有点害怕所有这些警告来自各处。有没有人测量性能或其他什么?如果存在一些性能问题,我们可以在什么有效负载下遇到它们?
就主要目的而言,我们有一个经典的情况ReaderWriterLock
,即多读少写。usinglock
语句会阻塞所有读者。也许这对我们来说不是一个可怕的问题,但如果我可以使用ReaderWriterLock
我会更满意。IMO 引入多台显示器确实是一个非常非常糟糕的主意。
c# - 再次双重检查锁定和 C#
最近我一直在重构我的一些 C# 代码,我发现一些双重检查锁定实践正在发生。那时我不知道这是一种不好的做法,我真的想摆脱它。
问题是我有一个类应该被延迟初始化并经常被许多线程访问。我也不想将初始化移动到静态初始化器,因为我计划使用弱引用来防止初始化对象在内存中停留太久。但是,如果需要,我想“恢复”对象,确保以线程安全的方式发生这种情况。
我想知道是否在 C# 中使用 ReaderWriterLockSlim 并在第一次检查之前输入 UpgradeableReadLock,然后在必要时输入写锁进行初始化将是一个可接受的解决方案。这是我的想法:
我的观点是,没有其他线程应该再次尝试初始化该项目,而一旦值被初始化,许多线程应该同时读取。如果获取了写锁,可升级读锁应该阻塞所有读取器,因此在初始化对象时,行为将类似于在可升级读锁开始的地方有一个锁语句。初始化后,可升级读锁将允许多个线程,因此不会出现等待每个线程的性能损失。
我还在这里阅读了一篇文章,说 volatile 会导致在读取之前和写入之后自动插入内存屏障,因此我假设在读取和写入之间只有一个手动定义的屏障就足以确保正确读取 _valueReference 对象。我很乐意感谢您对使用这种方法的建议和批评。
c# - 是否需要锁定对布尔值的访问,或者是否过度杀伤
我有一个主要设计为 POCO 类的类,各种线程和任务可以读取它的值,只有其他人只是偶尔更新这些值。这似乎是 ReaderWriterLockSlim 的理想方案。
问题是,在类中,如果需要线程安全的属性,如果该属性是布尔值,这是否矫枉过正?如果它是一个 int 会发生什么?约会时间?
所有这些代码是否矫枉过正,而且是一个简单的...
……就够了吗?因为Type是bool,安全吗?如果是这样,什么时候变得不安全?字节?诠释?约会时间?
编辑
我的基本架构是拥有此类存储状态。也许有一项服务负责对此类进行写入。所有其他类都可以根据此状态数据读取并执行其逻辑。我会尽我所能确保所有数据是一致的,但如下所述,我主要关心的是数据的原子性和分割。
结论
感谢大家的回复,都很有价值。我主要关心的是写入/读取的原子性(即担心分裂)。对于 .NET 平台,如果所讨论的变量是小于 4 字节的内置值类型,则读写是原子的(例如,short 和 int 可以,long 和 double 不是)。
.net - 简化 ReaderWriterLockSlim 语法
我最近不得不使用ReaderWriterLockSlim
同步访问多个线程之间共享的多个资源。在做的过程中,我觉得使用起来ReaderWriterLockSlim
并不容易,特别是当你必须在多个地方使用它时。你必须有try...finally
块并记住打开和关闭锁。在许多情况下,我还发现自己打开了写锁并关闭了读锁,而不是关闭了写锁。因此,我试图想出一种更简单的方法来使用ReaderWriterLockSlim
. 这就是我得到的地方
现在例如,如果我们需要同步对 a 的访问,List<string>
这就是我们使用上面的类的方法
您认为这种方法更好吗?有没有什么缺点或者缺点。
c# - c#中的可升级读卡器锁
我有一个在多个线程之间共享的字典。每个线程根据给定的键从字典中读取特定值,但是 - 如果字典中不存在该键,则线程需要将其添加到字典中。
为了解决同步问题,我想使用 ReaderWriterLockSlim 类,它基本上给了我读者-作者锁同步(意味着读者可以并行运行,但一次只能有一个作者......),但为读者添加了升级选项。使用升级选项,我可以测试给定的密钥是否已经在字典中,如果没有 - 升级锁并编写它,承诺每个密钥只添加一个。
我的问题是我不能一次创建两个可升级的锁 - 这意味着这个解决方案不好...... :(
有人可以向我解释为什么微软选择以这种方式实现可升级锁(我一次不能拥有多个可升级锁......),并告诉我如何自己实现可升级锁\给同步我的共享字典的另一个想法?
c# - ReaderWriteLockSlim 或 Lock
我正在使用 ConcurrentBag 在运行时存储对象。在某些时候,我需要清空包并将包内容存储到列表中。这就是我所做的:
我的问题是同步,据我所知,书锁比其他同步方法快。来源——http: //www.albahari.com/threading/part2.aspx。
性能是我的第二个关注点,我想知道此时我是否可以使用 ReaderWriterLockSlim。使用 ReaderWriterLockSlim 有什么好处?原因是,我不希望此操作阻止传入请求。
如果是,我应该使用升级锁吗?
有任何想法吗 ?评论?