从 T 创建 std::future<T> 的最佳方法

dal*_*lle 6 c++ future c++11

我正在使用 astd::future<T>来存储可选异步操作的结果。根据函数的参数,操作可以是异步的,也可以是同步的。在同步情况下,我想将一个值存储在future. 我怎样才能最好地做到这一点?

https://en.cppreference.com/w/cpp/thread/future中给出的示例是:

  1. future从一个packaged_task
  2. future从一个async()
  3. future从一个promise

但是没有 a make_future,构造函数也不允许从值future创建一个已完成的。 future因此,我创建了一个辅助函数来执行此操作,方法如下promise

template <typename T>
std::future<T> make_future(T&& t)
{
   std::promise<T> p;
   p.set_value(std::forward<T>(t));
   return p.get_future();
}
Run Code Online (Sandbox Code Playgroud)

std::future<T>这是从 a创建 a 的有效方法吗T

std::future<T>有没有更好的方法从 a创建 a T

编辑:示例,缓存:

Foo readAndCacheFoo(int id);

std::future<Foo> readFooAsync(int id)
{
   {
      const lock_guard lock{cacheMutex};
      if (id == cachedId)
      {
         return make_future(cachedFoo);
      }
   }

   return std::async(readAndCacheFoo, id);
}
Run Code Online (Sandbox Code Playgroud)

bar*_*top 3

这可以很容易地完成,但有点复杂:

template <typename T>
std::future<T> make_future(T&& t)
{
    auto fun = [val=std::forward<T>(t)]() { return val; };
    std::packaged_task<T()> task(std::move(fun));
    auto future = task.get_future();
    task();
    return future;
}
Run Code Online (Sandbox Code Playgroud)

请注意,std::futurepackaged_task应该共享内部状态,因此这应该是安全的

编辑:实际上,您的代码似乎也是有效的,甚至更简单