繁体   English   中英

加入线程时无限循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM