有没有办法在std :: experimental :: future中使用std :: async?

时间:2017-03-16 10:37:03

标签: c++ multithreading concurrency synchronization c++17

注意:即使在C ++ 17中,以下内容也是非法的!

#include <thread>
#include <future>
#include <experimental/future>

using namespace std;

int step1(experimental::future<int>)
{
    return {};
}

int step2(experimental::future<int>)
{
    return {};
}

int step3(experimental::future<int>)
{
    return {};
}

int main()
{
    return async([](){ return {}; })
        .then(step1)
        .then(step2)
        .then(step3)
        .get();
}

C ++ 1z提供了两种future

  1. std::future
  2. std:experimental::future
  3. 但是,std::async仅返回std::future,因此上述代码是非法的。如果std::async返回std:experimental::future,则表示没问题。

    我的问题是:

    有没有办法将std::asyncstd::experimental::future一起使用,使C ++ 1z下的代码合法化?

2 个答案:

答案 0 :(得分:3)

  

有没有办法将std::asyncstd::experimental::future一起使用,使C ++ 1z下的代码合法化?

不。 std::async会返回一个std::future<T>,尽管名称是std::experimental::future<T>,但它与async完全不相关。

您必须编写自己的future版本,为您提供新的template <class F, class... Args, class R = std::invoke_result_t<std::decay_t<F>, std::decay_t<Args>...>> std::experimental::future<R> new_async(F&& f, Args&&... args) { std::experimental::promise<R> p; auto fut = p.get_future(); std::thread thread([p=std::move(p), f=std::forward<F>(f), args=std::tuple<std::decay_t<Args>...>(std::forward<Args>(args)...)] () mutable { try { if constexpr(std::is_void_v<R>) { std::apply(std::move(f), std::move(args)); p.set_value(); } else { p.set_value(std::apply(std::move(f), std::move(args))); } } catch(...) { p.set_exception(std::current_exception()); } }); thread.detach(); return fut; } 种类。简化版本可能是:

async

这不支持像POST newindex/test/1460333 { "title": "Your top FIY tips", "content": "Fix It Yourself in April 2012.", "tags": [ { "tagName": "Fix it yourself" }, { "tagName": "customer tips" }, { "tagName": "shoud not return" } ] } POST newindex/test/1460 { "title": "Your top FIY tips", "content": "Fix It Yourself in April 2012.", "tags": [ { "tagName": "Fix it yourself" }, { "tagName": "customer tips" }, { "tagName": "competition" } ] } 这样的其他启动策略,但它只是一个开始。

答案 1 :(得分:0)

seems like std::experimental::futurestd::future具有相同的构造函数,因此应该可以从std::experimental::future构造std::future。但是,pointed out ildjarn根据the latest draft实际上不是https://console.ng.bluemix.net/docs/openwhisk/openwhisk_alarms.html#openwhisk_catalog_alarm,因此在TS相应更改之前似乎无法做到这一点。