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

标签 c++ multithreading c++11

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

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/

相关文章:

c++ - std::array 大括号如何初始化?

c++ - 将变量分配给字符串

java - 如何停止 java java.util.Timer()

c++ - for_each 不返回( bool )值

c++ - 为什么 move 返回一个右值引用参数需要用 std::move() 包装它?

C++异常类扩展语法

c++ - COM 进程内 DLL 中的 DllMain 问题

c# - 计时器占用内存(每秒3MB)

Python线程化多个bash子进程?

c++ - C++11 中带有虚拟成员的虚拟析构函数