gpt4 book ai didi

c++ - C++ 中的多个异步调用

转载 作者:太空狗 更新时间:2023-10-29 20:35:33 28 4
gpt4 key购买 nike

我想多次调用异步方法。一个简化的例子如下所示:

size_t counter(std::string &s)
{
return s.size();
}

void stringCountAccumulator()
{
std::vector<std::string> foos = {"this", "is", "spartaa"};
size_t total = 0;
for (std::string &s : foos)
{
std::future<size_t> fut = std::async(
std::launch::async,
counter, s);

total += fut.get();
}
std::cout << "Total: " << total;
}

似乎 fut.get() 会阻止其他 future 调用。我如何在 C++ 中实现这个问题?我需要在单独的线程中调用一个函数。此函数“返回”一个值。

最佳答案

void stringCountAccumulator()
{
std::vector<std::string> foos = {"this", "is", "spartaa"};
std::vector<std::future<size_t>> calcs;
for (auto&& s : foos) {
calcs.push_back( std::async(
std::launch::async,
counter, s)
);
}
std::size_t total = 0;
for (auto&& fut:calcs)
total += fut.get();
std::cout << "Total: " << total << "\n";
}

.get() 正在阻塞。因此,在将所有任务排入队列之前不要阻塞。

另一种计划是编写/查找一个线程池,并让每个任务更新一个可能是原子的(或互斥锁保护的)计数器。

保护已完成的任务计数器(同样,可能是原子的)。

当最后一个任务完成时(由最后一个任务完成)有一个 promise (总数)。

从那个 promise 中返回 future 。现在你有一个代表整个线程池的 future ,计算它们的值并将其相加,具有大量并发性。

一些框架,比如微软的 ppl,有一个系统可以为你做这样的事情;你有返回值的任务和一个组合值的函数对象,并从中得到组合的结果。

关于c++ - C++ 中的多个异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42314185/

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