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()
在哪个范围内被调用。
- 如果我在
taskRunner()
方法的末尾调用它,它将
在 Worker 线程的范围内执行,对吗?但它是
从其成员中删除父对象的正确方法
线?
- 我也想过用
boost::signals2::signal
通知工作对象本身它的线程已完成,因此
Worker 可以要求线程池删除自己...?不是一个
矫枉过正?在 main 之间发出信号会是一个有意义的解决方案吗
和工作线程?
总的来说,我想避免主线程中的任何阻塞模式(Worker 所在的线程 运行)...
非常感谢任何知道如何解决这个问题的人...
您可以使用一些惰性删除例程,使用单个管家线程以特定时间间隔检查列表,并通过调用 Worker::getState() 检查其状态从列表中删除完成的 Worker 对象。
目标是实现在单独的线程中执行任务的 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()
在哪个范围内被调用。
- 如果我在
taskRunner()
方法的末尾调用它,它将 在 Worker 线程的范围内执行,对吗?但它是 从其成员中删除父对象的正确方法 线? - 我也想过用
boost::signals2::signal
通知工作对象本身它的线程已完成,因此 Worker 可以要求线程池删除自己...?不是一个 矫枉过正?在 main 之间发出信号会是一个有意义的解决方案吗 和工作线程?
总的来说,我想避免主线程中的任何阻塞模式(Worker 所在的线程 运行)... 非常感谢任何知道如何解决这个问题的人...
您可以使用一些惰性删除例程,使用单个管家线程以特定时间间隔检查列表,并通过调用 Worker::getState() 检查其状态从列表中删除完成的 Worker 对象。