结论

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();
    }
}
如果觉得我的文章对你有用,请随意赞赏