【问题标题】:thread pool example in "Concurrency in Action"“Concurrency in Action”中的线程池示例
【发布时间】: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_startblock_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


    【解决方案1】:

    是的,代码缺少一些东西,但这不是很重要。查看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 类也可能需要一些更改。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多