Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试std::lock[\u unique]std::shared\u互斥锁的线程是否会被调用std::lock\u shared的线程耗尽?_C++_Multithreading_C++11_Mutex_C++14 - Fatal编程技术网

C++ 尝试std::lock[\u unique]std::shared\u互斥锁的线程是否会被调用std::lock\u shared的线程耗尽?

C++ 尝试std::lock[\u unique]std::shared\u互斥锁的线程是否会被调用std::lock\u shared的线程耗尽?,c++,multithreading,c++11,mutex,c++14,C++,Multithreading,C++11,Mutex,C++14,关于std::shared_mutex和获取unique_lock的问题 假设有3个线程: 2个读卡器(试图锁定\u shared()std::shared\u mutex),以及 1个写入程序(试图锁定[\u unique]()共享互斥锁std::shared\u mutex) 试图锁定[\u unique]()的写入程序是否可能会饿死?例如:始终至少有一个读卡器拥有std::shared_lock,并且lock[\u unique]()永远不会成功 或多或少:在std::shared\u

关于
std::shared_mutex
和获取
unique_lock
的问题

假设有3个线程:

  • 2个读卡器(试图
    锁定\u shared()
    std::shared\u mutex),以及
  • 1个写入程序(试图
    锁定[\u unique]()
    共享互斥锁
    std::shared\u mutex
试图
锁定[\u unique]()
的写入程序是否可能会饿死?例如:始终至少有一个读卡器拥有
std::shared_lock
,并且
lock[\u unique]()
永远不会成功

或多或少:在
std::shared\u互斥锁上
lock[\u unique]()
会阻止进一步
lock\u shared()
它的任何尝试吗


(非常确定升级锁可以在这里工作,但我想知道在共享互斥锁上是否有任何保证。)

或多或少:在
std::shared\u互斥锁上
lock[\u unique]()
会阻止进一步
lock\u shared()
它的任何尝试吗

该标准没有规定是否应该这样做,只是说:

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

因此,让后来的读者在等待编写者之后等待与否取决于实现


如果实现想要防止写入程序饥饿,那么它可能需要在线程尝试获取唯一锁时设置一个“writer waiting”标志,以便以后获取共享锁的尝试将被阻止,在唯一锁柜后面等待。在N2406参考实现中,这是在
状态
成员中输入的
写入位。

你所说的
lock[\u unique]()
是什么意思
std::lock
函数还是
std::unique\u lock
?我不认为使用不存在的函数名有什么好处
lock\u shared
lock
是非常独特的。我找不到任何参考资料表明饥饿自由是有保证的,所以我想这是可能的(取决于实现)。顺便说一句,c++11或14中不存在共享的互斥锁,但很可能是c++17引入的:“第二个动机是解释shared_互斥体中缺少读写器优先级策略。这是由于Alexander Terekhov提出的一种算法,该算法允许操作系统决定下一个获取锁的线程,而不考虑是否正在寻找唯一锁或共享锁。这导致完全缺少读写器星形但是这只描述了参考实现,而不一定是std libs中使用的实现。谢谢你的回答。我已经在某个时候测试了我用于此行为的实现(避免编写器饥饿,当它等待unique_lock时),确实是这样。不幸的是,在其他平台上不能保证这一点。