线程池 - 如何在成员线程完成后删除工作线程(此)



目标是实现在单独线程中执行任务的Worker。问题在于正确设计Worker关闭路径。因此:

class Worker
{
/* ... */
/**
* @brief Thread pool worker constructor
*
* Runs the worker's taskRunner() in the stand alone thread.
*/
Worker( ThreadPool * threadPool )
{
/* Run the task runner in new thread */
this->mThread = std::thread( std::bind( & Worker::taskRunner, this, threadPool ) );
}
/* ... */
};

工作线程在独立线程中运行其成员方法Worker::taskRunner。taskRunner看起来是这样的(删除了不必要的东西):

void taskRunner( ThreadPool * threadPool )
{
/* Infinite loop */
while( this->getState() != State::TERMINATED )
{
/* ... */
}
/* At this point, the thread is going to be finished */
}

一旦taskRunner的无限循环退出,我想删除Worker本身,该实例保存在std::list集合中的ThreadPool类中:

std::list<std::shared_ptr<Worker>> mWorkers;

我想使用void std::list::remove( const T& value );方法。

问题是在哪个范围内调用此remove()

  1. 如果我在taskRunner()方法的末尾调用它,它将在Worker线程的范围内执行,对吗?但是是吗从其成员中删除父对象的正确方法线程
  2. 我还考虑过使用boost::signals2::signal通知worker对象本身它的线程已完成,因此工作进程可以要求线程池删除自己。。。?是不是过度杀戮?这是一个有意义的完整解决方案吗和工人的线

通常,我希望避免主线程(Worker正在运行的地方)中的任何阻塞模式。。。非常感谢任何人对如何解决这个问题的想法。。。

您可以使用一些惰性删除例程,使用单个内务线程以一定的间隔检查列表,并通过调用Worker::getState()检查其状态来从列表中删除已完成的Worker对象。

最新更新