c++ - 履行一个(可能是无效的) promise

标签 c++ c++11

我正在编写一些多线程代码并使用 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/

相关文章:

c++ - 从另一个容器创建容器,在 C++ 中应用每个元素一些函数

C++ 默认大括号括起来的初始值设定项列表

c++ - 使用 std::min 或三元运算符的性能差异?

c++ - 编译时单例多次实例化检测

c++ - 使 "cout << obj1 + obj2 << endl;"工作

c++ - 默认堆栈大小

c++ - Mingw-w64 + 代码块 : No such file or directory

c++ - C++ 递归中未处理的异常错误

c++ - 使用 MSVC 2013 初始化 `static constexpr double`

c++ - 将元素替换为 vector 的特定位置