What's the C++ 11 way to fire off an asynchronous task and forget about it?

后端 未结 2 575
清酒与你
清酒与你 2020-12-13 13:43

I need something like this:

void launch_task()
{
    std::thread([](){ run_async_task(); });
}

Except thread\'s destructor will terminate m

相关标签:
2条回答
  • 2020-12-13 14:23

    Resurrecting an old thread, but there is a neat trick* how to achieve "fire and forget" functionality by using std::async as well, despite the blocking std::future that it returns. The main ingredient is a shared pointer to returned std::future that is captured in lambda by value, causing its reference counter to be incremented. This way the destructor of the std::future won't be invoked until lambda finished its work, providing real asynchronous behaviour, as desired.

    template <class F>
    void call_async(F&& fun) {
        auto futptr = std::make_shared<std::future<void>>();
        *futptr = std::async(std::launch::async, [futptr, fun]() {
            fun();
        });
    }
    

    *Kudos to a colleague of mine and true C++ expert, MVV, who showed this trick to me.

    0 讨论(0)
  • 2020-12-13 14:35

    Just detach it immediately after creation.

    std::thread([](){ run_async_task(); }).detach();
    

    Once detached, the thread will no longer be joinable, so ~thread() will have no effect. This answer discusses more details of this behavior.

    As mentioned by W.B. below, std::async will not work for the following reason, pulled from this reference.

    If the std::future obtained from std::async has temporary object lifetime (not moved or bound to a variable), the destructor of the std::future will block at the end of the full expression until the asynchronous operation completes

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