可以线程尝试std :: lock [_unique] std :: shared_mutex被调用std :: lock_shared的线程饿死吗?

hau*_*ron 10 c++ multithreading mutex c++11 c++14

关于std::shared_mutex和获得的问题unique_lock.

假设有3个主题:

  • 2名读者(努力lock_shared()std::shared_mutex),和
  • 1名作家(努力lock[_unique]()std::shared_mutex)

这位作家是否有可能lock[_unique]()被迫饿死?例如:在任何时候至少有一个读者拥有一个std::shared_lock,并且lock[_unique]()永远不会成功.

更多或更少:将lock[_unique]()一对std::shared_mutex块中的任何企图进一步lock_shared()呢?


(相当肯定boost::upgrade_lock可以在这里工作,但我想知道是否有任何保证裸露std::unique_locka std::shared_mutex)

Jon*_*ely 7

更多或更少:将lock[_unique]()一对std::shared_mutex块中的任何企图进一步lock_shared()呢?

该标准没有规定是否应该发生,它只说:

效果:阻止调用线程,直到可以为调用线程获取互斥锁的共享所有权.

所以它是由实现是否使后来的读者等待未决的作者.

如果实现想要阻止编写器饥饿,则可能需要在线程尝试获取唯一锁时设置"写入器等待"标志,以便稍后尝试获取共享锁将阻塞,等待独特的锁定器后面.在N2406参考实现中,这是成员中的write_entered_state.

  • 刚刚测试(2023 年,在 Linux 上):gcc+libstdc++ 允许饥饿,而 clang+libc++ 则不允许。在线:https://godbolt.org/z/3675cj55b (3认同)