【发布时间】:2010-11-24 07:28:30
【问题描述】:
我的项目需要一个完全递归的多读取器/单写入器锁(共享互斥锁)——我不同意如果你有完整的 const 正确性就不需要它们的想法(有在 boost 邮件列表上对此进行了一些讨论),在我的情况下,锁应该保护一个完全透明的缓存,该缓存在任何情况下都是可变的。
至于递归 MRSW 锁的语义,我认为唯一有意义的是,在共享锁之外获取独占锁会暂时释放共享锁,当独占锁释放时重新获取。
有点奇怪的效果是解锁可以等待,但我可以忍受 - 无论如何编写很少发生,递归锁定通常只通过递归代码路径发生,在这种情况下,调用者必须准备好调用可能会在任何情况下等待案子。为了避免这种情况,人们仍然可以简单地升级锁而不是使用递归锁。
在独占锁之上获取共享锁显然只会增加锁计数。
所以问题就变成了——我应该如何实现它?带有临界区和两个信号量的常用方法在这里行不通,因为据我所知,唤醒的线程必须通过将其线程 ID 插入锁的所有者映射中来握手。
我想这可以通过两个条件变量和几个互斥锁来实现,但最终会使用的同步原语数量之多,对我来说听起来有点过多的开销。
我突然想到的一个想法是利用 TLS 来记住我持有的锁的类型(可能还有本地锁的计数)。必须考虑清楚 - 但我现在仍然会发布问题。
目标平台是 Win32,但这并不重要。请注意,我专门针对 Win2k,因此与 Windows 7 中新的 MRSW 锁定原语相关的任何内容都与我无关。 :-)
【问题讨论】:
标签: c++ multithreading synchronization