目录

目录

condition_variable一些细节

2024-10-04 13:03:39

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通过了
 */

文章简介