gpt4 book ai didi

c++11 异步延续或尝试 .then() 语义

转载 作者:IT老高 更新时间:2023-10-28 22:22:07 25 4
gpt4 key购买 nike

以下代码基于 Herb Sutter's实现 .then() 类型延续的想法。

  template<typename Fut, typename Work>
auto then(Fut f, Work w)->std::future<decltype(w(f.get()))>
{ return std::async([=] { w(f.get()); }); }

这将被用作 auto next = then(f, [](int r) { go_and_use(r); }); 或类似的。

这是一个巧妙的想法,但就目前而言是行不通的( future 只能移动,不可复制)。我确实喜欢这个想法,因为据我所知,它可能会出现在即将发布的 c++ 版本中(尽管是 .then() 甚至等待。)

在共享futures或类似的东西之前,我想知道堆栈溢出社区会如何看待这个实现,特别是改进和建议(甚至是共享futures)?

提前感谢您的任何建议。

(我知道这是一个修复,直到基于标准的机制存在,因为它会花费一个线程(也许))。

最佳答案

我发现上述实现存在 3 个问题:

  • 仅当您将 std::shared_future 作为 Fut 传递时才会起作用。
  • 延续可能希望有机会处理异常。
  • 它不会总是按预期运行,因为如果您不指定 std::launch::async 它可能会被延迟,因此不会像预期的那样调用延续。

我试图解决这些问题:

template<typename F, typename W, typename R>
struct helper
{
F f;
W w;

helper(F f, W w)
: f(std::move(f))
, w(std::move(w))
{
}

helper(const helper& other)
: f(other.f)
, w(other.w)
{
}

helper(helper&& other)
: f(std::move(other.f))
, w(std::move(other.w))
{
}

helper& operator=(helper other)
{
f = std::move(other.f);
w = std::move(other.w);
return *this;
}

R operator()()
{
f.wait();
return w(std::move(f));
}
};

}

template<typename F, typename W>
auto then(F f, W w) -> std::future<decltype(w(F))>
{
return std::async(std::launch::async, detail::helper<F, W, decltype(w(f))>(std::move(f), std::move(w)));
}

这样使用:

std::future<int> f = foo();

auto f2 = then(std::move(f), [](std::future<int> f)
{
return f.get() * 2;
});

关于c++11 异步延续或尝试 .then() 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14200678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com