gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:08:38 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com