我正在使用 C++11 线程库在 C++ 中编写一个多线程程序。
我有以下要求:
- 主线程监听某种类型的事件,并为每个新事件触发一个新线程
- 当请求程序终止时,新线程的创建被阻塞,我们等待旧线程完成
我可以选择将线程存储在某个容器中,例如列表。在退出之前,容器中的所有线程都被join()
-ed。但是,由于 STL 容器不是线程安全的,因此在添加新线程和从容器中删除完成的线程时需要额外的同步。在这种情况下,主线程和子线程之间的交互变得有点复杂。子线程是否应该将自己从容器中移除?如果不是,它如何让主线程知道何时删除?等等
我看到的另一种方法是拥有一个原子 int,它在创建子线程时由主线程递增,并在子线程终止之前由子线程递减(线程将detach()
在创建后 -ed,所以我不必管理任何 std::thread 对象)。在退出之前,我们只需在一个简单的循环中等待原子整数变为 0。这个解决方案对我来说看起来更好,因为移动部件更少并且没有锁定(至少只要目标平台具有无锁实现std::atomic<int>
)。
所以,我的问题是,您更喜欢上述哪种方法?