关于std :: shared_mutex和获取unique_lock的问题.
假设有3个主题:
> 2个读者(尝试lock_shared()std :: shared_mutex),和
> 1作者(试图锁定[_unique]()std :: shared_mutex)
试图锁定[_unique]()的作者是否可能会被饿死?例如:在任何时候至少有一个读者拥有std :: shared_lock,而lock [_unique]()永远不会成功.
或多或少:会在std :: shared_mutex块上锁定[_unique]()任何进一步lock_shared()的尝试吗?
(相当确定boost :: upgrade_lock可以在这里工作,但我想知道在std :: shared_mutex上是否有任何保证裸std :: unique_lock)
解决方法
More or less: would
lock[_unique]()
on astd::shared_mutex
block any attempts to furtherlock_shared()
it?
该标准没有规定是否应该发生,它只说:
Effects: Blocks the calling thread until shared ownership of the mutex can be obtained for the calling thread.
因此,它是由实现是否使后来的读者等待未决的编写者.
如果实现想要阻止编写器饥饿,则可能需要在线程尝试获取唯一锁时设置“写入器等待”标志,以便稍后尝试获取共享锁将阻塞,等待独特的锁定器后面.在N2406参考实现中,这是state成员中的write_entered_位.