兑现(可能是无效的)承诺

巴里

我正在编写一些多线程代码,并使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章