我正在编写一些多线程代码,并使用promise / future在另一个线程上调用一个函数并返回其结果。为简单起见,我将完全删除线程部分:
template <typename F>
auto blockingCall(F f) -> decltype(f())
{
std::promise<decltype(f())> promise;
// fulfill the promise
promise.set_value(f());
// block until we have a result
return promise.get_future().get();
}
这对于任何返回non-的函数都非常有用void
。返回未来的return语句也适用void
。但是我不能实现诺言iff
是一个void
函数,因为:
promise.set_value(f()); //错误:无效使用void表达式
是否有一些聪明的方法可以在线设置void
大小写值,还是我只需要编写一个辅助函数,如andcall_set_value(promise, f)
的重载?std::promise<R>
std::promise<void>
Apromise
只是一种异步结果提供程序。代替a,promise
您可以使用packaged_task
包装可调用对象的a,类似于a,std::function
不同之处在于调用它使结果可以通过a获得future
(当然,它可以处理void
和非无效结果之间的差异):
template <typename F>
auto blockingCall(F f) -> decltype(f())
{
std::packaged_task<decltype(f())()> task(std::move(f));
task();
// block until we have a result
return task.get_future().get();
}
NB根据目前的标准,该代码将有一个数据比赛中,如果task()
与task.get_future()
发生在单独的线程(等会你原来使用的承诺),所以你应该叫get_future()
移交前的任务给其他线程。实际上,它在实际实现中应该是安全的,并且存在一个库问题(LWG 2412)使其仍然有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句