c++ - 有序完成的异步线程池

标签 c++ multithreading

在基本线程池模式中,主线程将任务推送到请求队列。线程池以未指定的顺序执行任务,并在每个任务完成时向主事件循环发布通知。

在某些情况下,您可以从额外的吞吐量中受益,但您只能以指定的顺序使用已完成的任务。假设您有一个音频应用程序。主线程发送要由线程池处理的音频 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';
}

处理.get() 同步返回 std::future 对象,以便您的 parallel_sum 使用多个线程执行并通过有序线程连接返回结果。因此,通过更改此示例,您可以使用并行 block 处理音频数据并按顺序返回最终结果。

std::async 解释和原始示例 link

关于c++ - 有序完成的异步线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134851/

相关文章:

multithreading - Perl线程递增变量

c# - 循环的不同行为

c++ - 为什么模板实参用作另一个模板的模板参数时不能推导出来?

c++ - 没有库函数复制字符矩阵(char**)

c++ - 如何在 C++ 中根据 cv 限定符选择构造函数?

multithreading - 复制 `std::thread::spawn` 导致堆栈溢出

python - mpi4py中哪些操作是 "synchronization"操作

java - 关闭套接字连接

c++ - 需要帮助理解 Boost.Atomic Memory 模型 `memory_order_release` 示例

c++ - 任何程序都会检测到 C/C++ 结构中的缓冲区溢出吗?