ThreadPool - 如何在其成员线程完成后删除 Worker (this)

ThreadPool - How to delete Worker (this) once it's member thread is finished

目标是实现在单独的线程中执行任务的 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 的无限循环,我想删除实例保存在 ThreadPool class in std::list 集合中的 Worker 本身:

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

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

问题是这个remove()在哪个范围内被调用。

  1. 如果我在 taskRunner() 方法的末尾调用它,它将 在 Worker 线程的范围内执行,对吗?但它是 从其成员中删除父对象的正确方法 线?
  2. 我也想过用boost::signals2::signal 通知工作对象本身它的线程已完成,因此 Worker 可以要求线程池删除自己...?不是一个 矫枉过正?在 main 之间发出信号会是一个有意义的解决方案吗 和工作线程?

总的来说,我想避免主线程中的任何阻塞模式(Worker 所在的线程 运行)... 非常感谢任何知道如何解决这个问题的人...

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