gpt4 book ai didi

c++ - 管理多个并发线程

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:44 25 4
gpt4 key购买 nike

我正在使用 C++11 线程库在 C++ 中编写多线程程序。

我有以下要求:

  1. 主线程监听某种类型的事件,并为每个新事件触发一个新线程
  2. 当请求程序终止时,新线程的创建被阻止,我们等待旧线程完成

我可以选择将线程存储在某个容器中,例如列表。退出前容器内所有线程都是join() -编辑。但是,由于 STL 容器不是线程安全的,因此在添加新线程和从容器中删除完成的线程时需要额外的同步。主线程和子线程之间的交互在这种情况下变得稍微复杂一些。子线程应该从容器中移除自己吗?如果不是,它如何让主线程知道什么时候删除?等

我看到的另一种方法是拥有一个原子整数,当创建子线程时主线程递增,并在终止前由子线程递减(线程将在创建后被 detach() 编辑,所以我将不必管理任何 std::thread 对象)。在退出之前,我们只是在一个简单的循环中等待原子整数变为 0。这个解决方案对我来说看起来更好,因为移动部件更少并且没有锁定(至少只要目标平台具有 std::atomic<int> 的无锁实现)。

那么,我的问题是,您更喜欢以上哪种方法?

最佳答案

我会选择使用线程计数器,并结合条件等待。最后一个退出的线程应该向条件变量发出信号以唤醒服务员。

// the waiter
{
std::lock_guard<std::mutex> g(threads_lock);
while (threads > 0) {
threads_cond.wait(threads_lock);
}
}
//...

// the threads that are exiting
if (--threads == 0) {
std::lock_guard<std::mutex> g(threads_lock);
threads_cond.notify_one();
}

当然,这是假设 threadsstd::atomic

关于c++ - 管理多个并发线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11299646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com