Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Workaround for blocking async?

Tags:

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

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

But I don't want to block!

I'm considering to use the following workaround:

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

Is this ok? Or would you recommend a different solution?

like image 312
StackedCrooked Avatar asked Apr 30 '13 09:04

StackedCrooked


1 Answers

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;    } 
like image 73
Stephan Dollberg Avatar answered Sep 19 '22 18:09

Stephan Dollberg