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

c – 线程尝试std :: lock [_unique] std :: shared_mutex可以被调用std :: lock_shared的线程饿死吗?,第1张

概述关于std :: shared_mutex和获取unique_lock的问题. 假设有3个主题: > 2个读者(尝试lock_shared()std :: shared_mutex),和 > 1作者(试图锁定[_unique]()std :: shared_mutex) 试图锁定[_unique]()的作者是否可能会被饿死?例如:在任何时候至少有一个读者拥有std :: shared_lock,而 关于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 a std::shared_mutex block any attempts to further lock_shared() it?

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

Effects: Blocks the calling thread until shared ownership of the mutex can be obtained for the calling thread.

因此,它是由实现是否使后来的读者等待未决的编写者.

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

总结

以上是内存溢出为你收集整理的c – 线程尝试std :: lock [_unique] std :: shared_mutex可以被调用std :: lock_shared的线程饿死吗?全部内容,希望文章能够帮你解决c – 线程尝试std :: lock [_unique] std :: shared_mutex可以被调用std :: lock_shared的线程饿死吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1239374.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存