c++ - 尝试 std::lock[_unique] std::shared_mutex 的线程是否会被调用 std::lock_shared 的线程饿死?

标签 c++ multithreading c++11 mutex c++14

一个关于std::shared_mutexunique_lock获取的问题。

假设有3个线程:

  • 2 个读者(尝试 lock_shared() std::shared_mutex),和
  • 1 位作者(试图lock[_unique]() std::shared_mutex)

尝试 lock[_unique]() 的作者有没有可能饿死?例如:在任何时候至少有一个读者拥有一个 std::shared_lock,并且 lock[_unique]() 永远不会成功。

或多或少:在 std::shared_mutexlock[_unique]() 会阻止任何进一步 lock_shared() 它的尝试?


(很确定 boost::upgrade_lock 可以在这里工作,但我想知道 上的裸 std::unique_lock 是否有任何保证std::shared_mutex)

最佳答案

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 的线程饿死?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32243245/

相关文章:

c++ - 无法在 Windows 上编译 SQLCipher

c++ - 我可以 std::find stringstream 中的字符串吗?

ios - 在后台线程中将数据保存到 Realm 时发生崩溃。 | iOS | swift 4.2

java - 我可以访问为线程池线程提交任务(并且正在运行)的线程吗?

c++ - 如何确定 bind() 是否需要参数中的括号

c++ - 如何合并两个不同结构的容器( vector/列表),但在 C++ 中有一个公共(public)参数

c++ - 在 C++ 类中创建一个数组而不声明其大小

c++ - 为什么 unique_ptr 为空?

android - 为什么android服务运行在UI线程上?

c++ - 变量值,在三元运算符之后