"Concurrency in Action"中的线程池示例
thread pool example in "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;
}
在这里,我们有一个向量中存储的许多期货。每个future都是向线程池提交任务的结果。然而,当创建任务时(在第一个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
是的,代码缺少一些东西,但这不是很重要。看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
也可能需要一些改变。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- 在其他线程中循环访问该concurrent_vector时调用 concurrency::concurrent_vect
- "Concurrency in Action"中的线程池示例