我正在分析以下代码片段,并试图详细了解它:
template<typename FUNCTION, typename... ARGUMENTS>
auto ThreadPool::add( FUNCTION&& Function, ARGUMENTS&&... Arguments ) -> std::future<typename std::result_of<FUNCTION(ARGUMENTS...)>::type>
{
using PackedTask = std::packaged_task<typename std::result_of<FUNCTION(ARGUMENTS...)>::type()>;
auto task = std::make_shared<PackedTask>(std::bind(std::forward<FUNCTION>(Function), std::forward<ARGUMENTS>(Arguments)...));
// get the future to return later
auto ret = task->get_future();
{
std::lock_guard<std::mutex> lock{jobsMutex};
jobs.emplace([task]() { (*task)(); });
}
// let a waiting thread know there is an available job
jobsAvailable.notify_one();
return ret;
}
我对std::packaged_task
.
正如您在add(...)
方法体中看到的, std::packaged_task
-的实例task
是局部变量,其作用域以方法执行结束而结束。type的返回值ret
是std::future
copy返回的。的值ret
是由task
(本地的)给出的。因此,一旦方法执行完成,task
就会超出范围,所以我希望返回的连接的 std::future 实例变得无效,我的理解是否正确?
在方法的执行过程中,要在线程中执行的任务方法被放置到std::queue<Job> jobs
. 为什么只有指向 which 的指针operator()
持有std::packaged_task
对Function
给定方法参数的引用std::queue
?我希望直接存储std::packaged_task
以保存对正在创建的实例的引用......?
无论如何,源代码片段来自 ThreadPool 实现,可以在这里找到https://github.com/dabbertorres/ThreadPool并且似乎完全可以工作。所以我认为这是正确的,但不幸的是我并不完全清楚......如果有人能解释这些东西是如何工作的,我会很高兴......
非常感谢任何愿意提供帮助的人。干杯马丁