22

返された Future のデストラクタがブロックしているため、以下のasync呼び出しはブロックしています。

void foo() {}

void foo_async() {
    std::async(std::launch::async, foo);
}

でもブロックしたくない!

次の回避策を使用することを検討しています。

void foo_async() {
    std::thread(foo).detach();
}

これでよろしいですか?または、別のソリューションをお勧めしますか?

4

2 に答える 2

11

非ブロッキングの未来を提供する次のバージョンの async を使用できます。そのため、必要に応じて未来を利用できますが、反対に、ファイアアンドフォーゲットタスクが必要な場合は無視することができます.

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;   
}
于 2013-04-30T09:32:40.943 に答える
4

への呼び出しを本当に忘れたい場合foo()は、回避策は問題ないと思います。

それ以外の場合は、 を実行しauto f = std::async(std::launch::async, foo);、場合によっては から未来を返しますfoo_async()

于 2013-04-30T09:24:39.703 に答える