gpt4 book ai didi

c++ - "Concurrency in Action"中的线程池示例

转载 作者:行者123 更新时间:2023-11-28 02:16:58 24 4
gpt4 key购买 nike

Concurrency in Action 一书给出了如何在 C++11 中实现线程池的示例。

这里是 list 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;
}

在这里,我们将许多 future 存储在一个 vector 中。每个 future 都是向线程池提交任务的结果。但是,当创建任务时(在第一个 for 循环中),仅提供了一个仿函数 (accumulate_block),而不提供参数(block_startblock_end):

        futures[i]=pool.submit(accumulate_block<Iterator,T>());

这是如何工作的?任务从哪里获取参数?

PS - 源代码可在线获得:https://www.manning.com/books/c-plus-plus-concurrency-in-action

最佳答案

是的,代码缺少一些东西,但这不是很重要。查看 accumulate_block 的定义:

template<typename Iterator,typename T>
struct accumulate_block
{
T operator()(Iterator first,Iterator last)
{
return std::accumulate(first,last,T());
}
};

我们看到 block_start 和 block_end 应该以某种方式提供给 pool.submit 调用。以下是它的实现方式:

futures[i]=pool.submit([block_start, block_end]()
{
accumulate_block<Iterator,T> a();
return a(block_start, block_end);
});

thread_pool 类也可能需要一些更改。

关于c++ - "Concurrency in Action"中的线程池示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33766857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com