问题标签 [rwlock]
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.
linux - 什么时候使用作家首选的读写器锁?
我知道有很多读者首选的rwlock,还有更激进的设计,例如RCU,通常被认为是读者首选的。
但是,如果作者并不比读者少多少呢?我知道仅写入器的 rwlock 将退回到排他锁,但请考虑以下模式
- 作家最多,但也有一些读者,也许 80% W 对 20% R?
- 作家和读者是偶数,50% W vs 50% R
- 读者最多,但作者不能忽视,他们对延迟有要求,20% W vs 80% R
我有两个问题
- 这种情况真的存在吗,尤其是前两种情况?我不知道任何适合这些类型的用户级应用程序。用户级示例是首选。
- 如果确实有适合类型 1/2/3 的应用程序,是否有任何现有的方法可以提高锁定性能?
rust - Rust 中带有 RwLockGuard 的 HashMap 记录光标
我是 Rust 新手,我正在尝试实现一个简单的、线程安全的内存键值存储,HashMap
在RwLock
. 我的代码如下所示:
到目前为止,这段代码工作正常。问题是我正在尝试实现一个scan()
函数,该函数返回一个Cursor
可用于迭代所有记录的对象。我希望Cursor
对象保持 a RwLockGuard
,直到释放光标本身才释放(基本上我不想在光标处于活动状态时允许修改)。
我试过这个:
但这不起作用,因为我收到了这个编译错误:
有任何想法吗?
linux - rwlock 的开销能否高于 mutex 的开销?
我将 a 实现sorted linked list
为两个版本。第一个mutex
对整个列表使用 single,第二个rwlock
对整个列表使用 single。
我运行了一半的操作,Member
另一半进行Insert(0.25)
操作Delete(0.25)
。我根据多个线程绘制了时间,在这种情况下,时间并不像预期的那样rwlock
高于mutex
.
这怎么可能发生?当有超过 90% 的会员运营时,就rwlocks
如预期的那样好。
c - 为什么 rwlock 在 linux 内核中比 seqlock 更受欢迎?
读了 Robert Love 的 LKD 之后,我学习了 rwlock 和 seqlock,它们都是基于 spinlock 的。
在区分读写器时,rwlock 比 spinlock 更好,它会获得更好的性能。然而, rwlock 会让作家饿了。
seqlock 解决了 rwlock 使 writer 饿死的问题,但是 seqlock 的使用比 rwlock 少。那么,为什么 rwlock 比 seqlock 更受欢迎呢?
c# - 如何使用 RWLock 实现多读一写的场景?
我正在尝试编写一种处理某些消息的方法。它们可以被读取或写入消息。允许并行读取,但是当write
获得锁时,所有后续的读锁都应该等到写锁被释放。所以我认为ReaderWriterLockSlim
这是我需要的。但是当我尝试实现简单的应用程序以查看它是否按预期工作时,我得到了Recursive read lock acquisitions not allowed in this mode
异常。
这是我的示例来展示它的工作原理:
预期结果: 100 行Readonly task start
, 1 行Write task start
, 然后 100 行Readonly task done
, 然后 1 行Write task done
, 然后程序的其余部分打印。
实际结果:
我不明白递归出现在哪里。我只是调用一个函数,没有任何递归。我阅读了文章,但我看不到它在这里是如何工作的。
linux-kernel - Linux内核:读写锁rwlock(死锁)的不理解行为
尝试使用(linux 内核)rwlock API,我得到了一个我无法理解为什么会发生的行为(死锁)。有人有什么解释吗?(请注意,代码仅用于实验,没有背后的逻辑:示例我知道在持有自旋锁时睡觉是个坏主意,但这对我测试的代码没有影响)。
代码如下,运行会导致死锁。
我正在获取日志:
我试图将运行时模式化:
无法理解的行为: 我想知道为什么 (w) 线程一直在 10s 旋转,情况与即时 3s 相同:r2 正在旋转,因为 w 试图获取写锁(w 正在旋转,因为 r1 持有锁),但是当r1 完成,w 应该被解锁并开始运行。这发生在 3 秒而不是 10 秒。
rust - 如何修改读锁内的内容?
我有一个包含两个字段的结构:读者数量和作者数量。当我使用写锁时,我会修改 writers 的值,并打印它们。当我使用读锁时,我想修改阅读器的数量,然后打印两个值。我可以做这样的事情吗?还是有其他方法可以做到这一点,例如某种带有互斥锁的计数器?
c++ - 多个阅读器时的 RWLock 与互斥锁
我正在实现一个 C++ 多线程应用程序,在某些变量上我的读者多于编写者(至少 30:1 的比例),我想使用 RWLocks(maybe pthread_rwlock
) 而不是 Mutexes( std::mutex
),因为它们似乎非常适合许多读者.
我读到的内容:
https ://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
https://www.arangodb.com/2015/02/comparing-atomic-mutex-rwlocks/
https://docs .oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/ReadWriteLock.html(java但我认为原理是一样的)
但似乎 RWLock 的自定义实现在内部至少包含一个互斥锁,那么为什么要使用 RWLock 呢?
multithreading - 线程中的 RwLock::spawn 不会释放锁
我不确定它为什么会挂起my.rw.write();
。
如果您取消注释sleep
呼叫,它工作正常。这意味着在 spawn 线程执行并释放RwLock
. 我觉得理论上应该没问题。我哪里错了?