【发布时间】:2016-02-19 09:49:39
【问题描述】:
Concurrency in Action一书提供了如何在 C++11 中实现线程池的示例。
这里是代码清单 9.3(第 279 页),它展示了如何使用线程池(前面几页实现过):
template<typename Iterator,typename T>
T parallel_accumulate(Iterator first,Iterator last,T init)
{
unsigned long const length=std::distance(first,last);
if(!length)
return init;
unsigned long const block_size=25;
unsigned long const num_blocks=(length+block_size-1)/block_size;
std::vector<std::future<T> > futures(num_blocks-1);
thread_pool pool;
Iterator block_start=first;
for(unsigned long i=0;i<(num_blocks-1);++i)
{
Iterator block_end=block_start;
std::advance(block_end,block_size);
futures[i]=pool.submit(accumulate_block<Iterator,T>());
block_start=block_end;
}
T last_result=accumulate_block<Iterator,T>()(block_start,last);
T result=init;
for(unsigned long i=0;i<(num_blocks-1);++i)
{
result+=futures[i].get();
}
result += last_result;
return result;
}
在这里,我们有许多期货存储在一个向量中。每个未来都是向线程池提交任务的结果。但是,在创建任务时(在第一个 for 循环中),只提供了一个仿函数(accumulate_block),而不提供参数(block_start 和 block_end):
futures[i]=pool.submit(accumulate_block<Iterator,T>());
这如何工作?任务从哪里获得参数?
PS - 源代码可在线获取:https://www.manning.com/books/c-plus-plus-concurrency-in-action
【问题讨论】:
标签: c++ c++11 concurrency threadpool