我正在编写一些多线程代码并使用 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();
}
这适用于任何返回非 void
的函数。 .获得 future 的返回语句也适用于 void
.但是如果f
我不能兑现 promise 是 void
函数,因为:
promise.set_value(f()); // error: invalid use of void expression
是否有一些巧妙的方法来设置 void
中的值? case in-line,还是我只需要编写一个辅助函数,如 call_set_value(promise, f)
有 std::promise<R>
的重载和 std::promise<void>
?
最佳答案
promise
只是一种异步结果提供者。代替 promise
您可以使用包装可调用对象的 packaged_task
,类似于 std::function
只是调用它会产生结果可通过 future
获得(当然它处理 void
和非 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();
}
注意根据当前标准,如果 task()
和 task.get_future()
发生在不同的线程上,则此代码将发生数据竞争(您的原始代码也会使用 promise ),因此您应该在将任务交给另一个线程之前调用 get_future()
。在实践中,它在实际实现中应该是安全的,并且存在一个库问题 (LWG 2412) 使其仍然有效。
关于c++ - 履行一个(可能是无效的) promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27533373/