1.调用wait( _Lck, _Pred)如果_Pred返回false,condition_variable会解锁_Lck并阻塞线程
2.如果其他线程调用notify_one并且被通知的线程条件变量中_Pred返回true,condition_variable会等待锁并加锁继续运行线程。
std::mutex mtx;
std::condition_variable cv;
int num = 0;
thread_local int times=0;
std::thread th1([&]() {
std::unique_lock<std::mutex> lck(mtx);
std::cout << "th1加锁了\n";
cv.wait(lck, [&]() {return num == 1; });
std::cout << "th1通过了\n";
});
std::thread th2([&]() {
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, [&]() {return num == 0; });
++num;
cv.notify_one();
std::cout << "th2通知th1了";
std::this_thread::sleep_for(std::chrono::seconds(5));
});
th2.join();
th1.join();
/*会输出
*th1加锁了
*th2通知th1了
*等待5秒,此时th2锁住了mtx意味着th1 cv之前解锁了,此时cv在等待锁
*th1通过了
*/