我只是尝试这个样本来了解未来和承诺。
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吗?
答案 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
。