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