什么应该是运行异步的函数的返回类型

时间:2016-01-17 16:39:42

标签: c++ c++11 asynchronous

我只是尝试这个样本来了解未来和承诺。

void func(std::promise<int>& p) {
  p.set_value (0);
}

int main ()
{
  std::promise<int> p;                      
  std::future<int> f = p.get_future(); 
  std::thread t(func, std::ref(p));  
  int x = fut.get();            

  t.join();
  return 0;
}

如果func的返回类型无效,可以吗?如果是,如果返回类型与void

一起使用,则返回类型可以为std::async
 std::future<int> f = std::async(std::launch::async,  func);

如果std::future< int >的返回类型为func,是否会将异步的返回推断为void

请澄清负责设定承诺的函数的返回类型。

另外,应该根据 的使用方式来设计func吗?

1 个答案:

答案 0 :(得分:2)

在第一个示例中,std::thread构造函数运行的函数可以返回值,但忽略该值。

通过std::async调用,提供的函数的返回值(由std::result_of确定)设置返回的std::future的模板类型:

// function returns an int so std::async() returns a std::future<int>
std::future<int> fut = std::async(std::launch::async, []{ return 1; });

根据C++11标准:

30.6.8功能模板异步

  

4 返回:类型为future<typename result_of<F(Args...)>::type>的对象,它引用此异步调用创建的共享状态。

所以在你的第一个例子中,函数的返回类型并不重要,因为它是设置std::promise的函数体,而不是返回值。

但是,对于std::async(),return语句必须将共享值返回到std::future