[英]Infinite loop when joining threads
我正在尝试使用此处提供的ThreadPool
class
不幸的是,这个 class 的设计方式是在创建时创建其线程并将它们加入析构函数中。 为了使其更灵活并能够在其中多次创建线程,我在此 class 中添加了以下 function:
void join_all() {
condition.notify_all();
for (std::thread &worker : workers) {
worker.join(); // I get blocked here
}
}
但是,通过此更改,在运行以下主程序时:
int main() {
ThreadPool pool(4);
for (int i = 0; i < 8; ++i) {
pool.enqueue([i]() {
std::cout << "HELLO " << i << std::endl;
});
}
pool.join_all(); // here I am blocked
return 0;
}
在尝试加入第一个线程时,我的主线程将被阻止在join_all
function 内。
编写join_all()
function 的正确方法是什么,这将允许我继续使用池而不终止它?
ThreadPool
class 已经在其析构函数中加入了线程。 但是如果你想拥有自己的join_all()
function (出于任何原因),你也应该设置stop
变量:
void join_all()
{
{
std::unique_lock<std::mutex> lock(queue_mutex);
stop = true;
}
condition.notify_all();
for (std::thread &worker : workers) {
worker.join();
}
}
警告:现在,您应该小心线程上的双重连接。 所以,我建议在加入之前检查线程(例如在析构函数中):
for (std::thread &worker : workers)
{
if (worker.joinable())
{
worker.join();
}
}
通过这些更改,代码可以在没有任何无限循环的情况下工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.