C++11 新特性:多线程支持 - notify_all 的用法

文章讲述了std::condition_variable的notify_all()方法在多线程中的应用,特别是在线程池中,当共享资源状态改变时,它能唤醒所有等待的线程。提供了一个使用示例来说明其在控制线程同步和优化性能中的作用。
摘要由CSDN通过智能技术生成

std::condition_variablenotify_all()方法用于唤醒所有等待该条件变量的线程。

这与notify_one()不同,后者只唤醒一个等待的线程。使用notify_all()是在某些条件变化对所有等待线程都是有意义时的理想选择,

例如,在共享资源状态发生变化时,可能希望所有等待该资源的线程都能重新检查条件并继续执行。

使用场景

notify_all()常用于以下场景:

  • 当共享数据的状态变化可能影响到所有等待线程时。
  • 当程序逻辑要求在条件满足时所有线程都应该被唤醒继续执行。

使用示例

使用std::condition_variable实现简单的线程池结束通知

以下示例展示如何使用notify_all()在一个简化的线程池结束时通知所有工作线程停止工作:

#include <iostream>
#include <vector>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <atomic>

std::mutex mtx; // 互斥量,保护条件变量
std::condition_variable cv; // 条件变量
std::atomic<bool> done(false); // 原子变量,指示工作是否完成

void worker_thread(int id) {
    std::unique_lock<std::mutex> lock(mtx);
    while (!done.load()) {
        cv.wait(lock, [] { return done.load(); }); // 等待done变为true
        std::cout << "Worker thread " << id << " is stopping." << std::endl;
    }
}

int main() {
    const int num_threads = 5;
    std::vector<std::thread> threads;

    // 创建多个工作线程
    for (int i = 0; i < num_threads; ++i) {
        threads.emplace_back(worker_thread, i);
    }

    // 模拟主线程中的工作
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
    done = true; // 标记工作完成
    cv.notify_all(); // 通知所有工作线程

    // 等待所有线程完成
    for (auto& t : threads) {
        t.join();
    }

    return 0;
}

输出:

Worker thread 1 is stopping.
Worker thread 2 is stopping.
Worker thread 4 is stopping.
Worker thread 0 is stopping.
Worker thread 3 is stopping.

在这个示例中,我们有几个工作线程,它们在done变量为false时会一直等待。

当主线程的模拟工作完成后,它将done设置为true并调用cv.notify_all(),这导致所有等待的工作线程被唤醒。每个工作线程检查done变量,发现它为true,于是输出消息并退出。

注意事项

  • 使用notify_all()时需要确保所有等待线程都应该被唤醒。过度使用notify_all()可能会导致性能问题,因为它会唤醒所有等待线程,即使有些线程可能并不需要被唤醒。
  • 在调用notify_one()notify_all()时不需要持有互斥量锁,但是修改条件变量所依赖的变量时(比如示例中的done变量)通常需要加锁,以保证数据的一致性和线程安全。

通过合理使用notify_all(),可以有效地控制多线程程序中的线程同步和通信,优化程序逻辑和性能。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值