c++多线程 唤醒notify_one/notify_all 必须发生在阻塞之前才是 有效唤醒

Posted Zetaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++多线程 唤醒notify_one/notify_all 必须发生在阻塞之前才是 有效唤醒相关的知识,希望对你有一定的参考价值。

如果线程 t 还没在条件变量 cv 上阻塞,此时在条件变量 cv 上进行唤醒操作,该唤醒操作首先显然对线程 t 现在不会有影响,同时也不会对之后线程 t 在条件变量 cv 上阻塞有影响。

效果

图中程序不再继续执行,进入永久等待阻塞状态。(子线程等待被唤醒,主线程等待子线程执行结束)。

测试代码

#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <chrono>

using namespace std;

bool flag = false;
mutex mtx;
condition_variable cv;
void f() // 子线程代码
	cout << "f started " << endl;
	this_thread::sleep_for(chrono::milliseconds(1000)); // 故意让主线程中的 notify_one 唤醒操作先执行
	unique_lock<mutex> lck(mtx);
	cv.wait(lck);
	cout << "f finished " << endl;
	return;


int main()

	thread t(f);
	cv.notify_one();// 唤醒一个等待 cv 这个条件变量上的的线程
	t.join();// 主线程等待子线程执行结束
	cout << "Hello World" << endl;
	return 0;

以上是关于c++多线程 唤醒notify_one/notify_all 必须发生在阻塞之前才是 有效唤醒的主要内容,如果未能解决你的问题,请参考以下文章

趣图:多线程相互唤醒

等待与唤醒机制

[javaSE] 多线程通信(等待-唤醒机制)

Java多线程虚假唤醒问题

Java多线程虚假唤醒问题(生产者和消费者关系)

java多线程(十三)Condition精准通知唤醒