You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:13:11