关于使用std::conditional_variable的notify_all()唤醒并行等待线程的疑问
关于使用std::condition_variable的notify_all()唤醒并行等待线程的疑问
嗨,我现在有点搞不懂std::condition_variable的一个用法场景。我手头有好几个正在等待的线程,本来想靠notify_all()一次性把它们都唤醒,让它们能并行处理后续的逻辑,但实际运行下来的结果好像和我预想的不太对,是不是我对这个函数的理解有偏差?
我参考了相关文档的示例代码做了修改,现在的代码是这样的:
#include <iostream> #include <condition_variable> #include <mutex> #include <thread> #include <vector> std::condition_variable cv; std::mutex cv_m; bool ready = false; void worker(int thread_id) { std::unique_lock<std::mutex> lk(cv_m); // 用while循环来避免虚假唤醒的问题 while (!ready) { cv.wait(lk); } std::cout << "线程 " << thread_id << " 已唤醒并开始执行\n"; } void wake_all() { std::lock_guard<std::mutex> lk(cv_m); ready = true; cv.notify_all(); } int main() { std::vector<std::thread> threads; // 创建5个等待状态的线程 for (int i = 1; i <= 5; ++i) { threads.emplace_back(worker, i); } std::cout << "5个线程已准备好,等待唤醒指令...\n"; // 触发所有线程唤醒 wake_all(); // 等待所有线程执行完成 for (auto& th : threads) { th.join(); } return 0; }
我本来以为notify_all()会让所有线程同时获取到锁然后并行执行,但实际运行时,控制台的输出是线程一个接一个打印的,这是怎么回事?难道notify_all()并不是真的让它们同时被唤醒吗?
备注:内容来源于stack exchange,提问作者buggi zhuk
相关产品推荐
相关产品推荐

