我想多次调用异步方法。一个简化的例子如下所示:
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/