管理多个并发线程

时间:2012-07-02 19:02:54

标签: c++ multithreading c++11 atomic

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

我有以下要求:

  1. 主线程侦听某些类型的事件,并为每个新事件触发新线程
  2. 当请求程序终止时,新的线程创建被阻止,我们等待旧线程完成
  3. 我可以选择将线程存储在某个容器中,例如列表。退出之前,容器中的所有线程都是join() - ed。但是,由于STL容器不是线程安全的,因此在添加新线程和从容器中删除已完成的线程时需要进行额外的同步。在这种情况下,主线程和子线程之间的交互变得稍微复杂一些。儿童线是否应从容器中取出?如果没有,它是如何让主线程知道什么时候删除?等

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

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

1 个答案:

答案 0 :(得分:1)

使用线程计数器将是我的选择,并结合条件等待。退出的最后一个线程应该通知条件变量唤醒服务员。

// 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();
}

这假设threads当然是std::atomic