#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)
上?
程序运行结果如上所示
条件变量进入wait状态时会自动解锁呀。。