结论
wait(unique_lock锁, 条件判断函数);
1.如果条件判断函数返回false:传入的锁解锁,线程阻塞
2.阻塞线程被notify后:锁定传入的锁
背景
我一开始纳闷,如果消费者先lock了mtx,生产者在加数据前尝试lock mtx,不会被阻塞住,形成死锁吗
查完cpp reference才知道condition的wait函数是会解锁传入的锁的
mutex mtx;
queue<char> tasks;
condition_variable condition;
void Producer()
{
while (1) {
this_thread::sleep_for(chrono::seconds(1));
// unique_lock
unique_lock<mutex> lock(mtx);
// 发布任务
tasks.push('a');
// 唤醒线程
condition.notify_one();
}
}
void Customer()
{
while (1) {
// unique_lock
unique_lock<mutex> lock(mtx);
// wait
condition.wait(lock, [](){return !tasks.empty();});
// 处理任务
printf("%c\n", tasks.front());
tasks.pop();
}
}
1 条评论
想想你的文章写的特别好www.jiwenlaw.com