std :: recursive_mutex不会死锁。
当多个线程多次锁定它时,它会死锁吗?答案 0 :(得分:7)
多个线程多次锁定它会导致死锁吗?
这种情况不可能发生。
通过定义,mutex最多被一个线程锁定。而std::recursive_mutex
是某种互斥体。否则它不符合mutual exclusion的目标,因为它应该是某种Mutex concept。
因此,甚至不允许另一个线程一次锁定它。当它这样做时,那个其他线程会被阻塞(直到锁被释放 - 多次被递归锁定)。
答案 1 :(得分:0)
仅供参考,这是一个递归互斥的简单实现:
static const std::thread_id NO_THREAD;
class recursive_mutex {
public:
void lock() {
auto me = std::this_thread::get_id();
if (owner != me) {
mtx.lock();
owner = me;
assert(count == 0);
}
count++;
}
void unlock() {
auto me = std::this_thread::get_id();
assert(owner == me);
assert(count > 0);
count--;
if (count == 0) {
owner = NO_THREAD;
mtx.unlock();
}
}
private:
std::mutex mtx;
std::thread::id owner;
unsigned count{0};
};