当被2个线程锁定时,recursive_mutex是否会死锁?

时间:2018-04-24 16:44:32

标签: c++ multithreading

相同的线程多次锁定它时,

std :: recursive_mutex不会死锁。

多个线程多次锁定它时,它会死锁吗?

2 个答案:

答案 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};
};