使用异步的并行函数调用 [重复]

Posted

技术标签:

【中文标题】使用异步的并行函数调用 [重复]【英文标题】:parallel function call with async [duplicate] 【发布时间】:2017-02-23 13:48:26 【问题描述】:

需要在循环中创建和运行线程。这是编译/运行的代码,但它不会并行创建/运行线程,即形成此代码,我希望三个线程并行运行,而是每次调用函数 say依次发生。为什么?

 template<typename T>
 void say(int n, T t)  
  cout << " say: " << n << std::flush;
  for(int i=0; i<10; ++i) 
    cout << " " << t << std::flush;
 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
   cout << " end " << std::flush << endl;


 template<typename F, typename... Ts>
 inline auto reallyAsync(F&& f, Ts&&... params)
  return std::async(
      std::launch::async,
      std::forward<F>(f),
      std::forward<Ts>(params)...);


 int main() 
  float x = 100;

  for(int i=0; i<3; ++i) 
    auto f = reallyAsync(&say<decltype(x)>, i, x*(i+1)) ;
  



output:
 say: 0 100 100 100 100 100 100 100 100 100 100 end 
 say: 1 200 200 200 200 200 200 200 200 200 200 end 
 say: 2 300 300 300 300 300 300 300 300 300 300 end 

【问题讨论】:

【参考方案1】:

async 返回一个未来。根据http://en.cppreference.com/w/cpp/thread/future/~future

它可能会阻塞 f 的结果,因为未来的析构函数会在 f 超出范围后调用

【讨论】:

以上是关于使用异步的并行函数调用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个函数进行异步函数调用?

在 C# 中的类构造函数中调用异步方法 [重复]

使用请求进行异步调用并让回调在函数中工作[重复]

从构造函数调用的异步方法[重复]

在循环中调用异步函数时避免重复创建函数

如何在.NET中调用异步函数而不等待它[重复]