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 必须发生在阻塞之前才是 有效唤醒的主要内容,如果未能解决你的问题,请参考以下文章