Workaround for blocking async?

前端 未结 2 2029
情歌与酒
情歌与酒 2020-12-14 02:11

The async call below is blocking because the destructor of the returned future is blocking:

void foo() {}

void foo_async() {
    std::async(std         


        
相关标签:
2条回答
  • 2020-12-14 02:40

    You could use the following version of async which provides a non-blocking future. As such you can take advantage of the future if you need it and on the other side you can just ignore it when you want a fire-and-forget task.

    template< class Function, class... Args>
    std::future<typename std::result_of<Function(Args...)>::type> async( Function&& f, Args&&... args ) 
    {
        typedef typename std::result_of<Function(Args...)>::type R;
        auto bound_task = std::bind(std::forward<Function>(f), std::forward<Args>(args)...);
        std::packaged_task<R()> task(std::move(bound_task));
        auto ret = task.get_future();
        std::thread t(std::move(task));
        t.detach();
        return ret;   
    }
    
    0 讨论(0)
  • 2020-12-14 02:48

    If you really want to fire-and-forget the call to foo(), I would say your workaround is OK.

    Otherwise, just do auto f = std::async(std::launch::async, foo);, and possibly return the future from foo_async().

    0 讨论(0)
提交回复
热议问题