作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在基本线程池模式中,主线程将任务推送到请求队列。线程池以未指定的顺序执行任务,并在每个任务完成时向主事件循环发布通知。
在某些情况下,您可以从额外的吞吐量中受益,但您只能以指定的顺序使用已完成的任务。假设您有一个音频应用程序。主线程发送要由线程池处理的音频 block 。多个 block 可以同时处理并无序完成,但主线程必须将每个处理的 block 按照提交处理的顺序推送到音频流。
我的第一个想法是使用某种线程安全队列(链表或双端队列)请求任务,并让主线程等待队列头部的“完成”标志,然后取消链接并使用的数据。进一步思考,我想到这个问题一定已经解决了很多次了。这通常如何在 C++ 中完成?
最佳答案
您可以查看 boost::io_service 的线程池问题。它易于使用和实现。
boost asynchronous io service
编辑:
您可以在 C++11 中使用 std::async 和 std::future 解决此连接问题。最简单的方法可能是这样的:
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <future>
template <typename RAIter>
int parallel_sum(RAIter beg, RAIter end)
{
auto len = end - beg;
if (len < 1000)
return std::accumulate(beg, end, 0);
RAIter mid = beg + len/2;
auto handle = std::async(std::launch::async,
parallel_sum<RAIter>, mid, end);
int sum = parallel_sum(beg, mid);
return sum + handle.get();
}
int main()
{
std::vector<int> v(10000, 1);
std::cout << "The sum is " << parallel_sum(v.begin(), v.end()) << '\n';
}
关于c++ - 有序完成的异步线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134851/
我是一名优秀的程序员,十分优秀!