"Concurrency in Action"中的线程池示例

thread pool example in "Concurrency in Action"

本文关键字:线程 Concurrency in Action      更新时间:2023-10-16

《操作中的并发》一书给出了如何在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;
}

在这里,我们有一个向量中存储的许多期货。每个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应该以某种方式被提供到CCD_ 5调用中。以下是如何实现:

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

类别thread_pool也可能需要一些改变。