生产者消费者模型中的锁的问题

#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>

using namespace std;

mutex mtx;
condition_variable produce, consume;

queue<int> q;
int maxSize = 20;

void consumer() {
    while (true) {
        // 
        unique_lock<mutex> lck(mtx);
        cout << "hello\n";
        consume.wait(lck, []{return q.size() != 0; });

        cout << "consumer " << this_thread::get_id() << ": ";
        q.pop();
        cout << q.size() << '\n';
        produce.notify_all();
    }
}

void producer(int id) {
    while (true) {
        this_thread::sleep_for(chrono::seconds(10));
        unique_lock<mutex> lck(mtx);
        cout << "hi\n";
        produce.wait(lck, [] { return q.size() != maxSize; });

        cout << "-> producer " << this_thread::get_id() << ": ";
        q.push(id);
        cout << q.size() << '\n';
        consume.notify_all();
    }
}

int main() {
    thread con(consumer);
    thread pro(producer, 1);
    con.join();
    pro.join();
    return 0;
} 

请问下,代码里面消费者和生产者都在锁同一个锁,为什么当消费者先拿到锁之后,生产者还可以获得锁?为什么生产者没有阻塞在unique_lock<mutex> lck(mtx)上?
图片描述

程序运行结果如上所示

阅读 2.1k
1 个回答
新手上路,请多包涵

条件变量进入wait状态时会自动解锁呀。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题