一个关于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]()
永远不会成功。
或多或少:在 std::shared_mutex
上 lock[_unique]()
会阻止任何进一步 lock_shared()
它的尝试?
(很确定 boost::upgrade_lock
可以在这里工作,但我想知道 上的裸
)std::unique_lock
是否有任何保证std::shared_mutex
最佳答案
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_
位。
关于c++ - 尝试 std::lock[_unique] std::shared_mutex 的线程是否会被调用 std::lock_shared 的线程饿死?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32243245/