小编Suj*_*ith的帖子

在同一个互斥锁上使用两个 std::unique_lock 会导致死锁吗?

我找到了这个代码,它实现了生产者-消费者问题。我在这里发布一段代码。

在给定的代码中,让我们考虑这样一个场景:生产者通过调用生成一个值void add(int num),它获取互斥体上的锁mu,并且 buffer.size()==size_这使得生产者由于条件变量 而进入等待队列cond

与此同时,发生上下文切换,消费者调用函数int remove()来消费 value ,它尝试获取 mutex 上的锁mu,但是生产者之前已经获取了锁,因此它失败并且永远不会消费该值,从而导致僵局。

我这里哪里出错了?因为代码在我运行时似乎工作正常,所以调试它对我没有帮助。

谢谢

void add(int num) {
        while (true) {
            std::unique_lock<std::mutex> locker(mu);
            cond.wait(locker, [this](){return buffer_.size() < size_;});
            buffer_.push_back(num);
            locker.unlock();
            cond.notify_all();
            return;
        }
    }
    int remove() {
        while (true)
        {
            std::unique_lock<std::mutex> locker(mu);
            cond.wait(locker, [this](){return buffer_.size() > 0;});
            int back = buffer_.back();
            buffer_.pop_back(); 
            locker.unlock();
            cond.notify_all();
            return back;
        }
    }
Run Code Online (Sandbox Code Playgroud)

c++ mutex deadlock producer-consumer unique-lock

5
推荐指数
1
解决办法
2313
查看次数

标签 统计

c++ ×1

deadlock ×1

mutex ×1

producer-consumer ×1

unique-lock ×1