Near the beginning of this clip from C++ And Beyond, I heard something about problems with std::async
. I have two questions:
For a junior devel
I could not disagree more about the advice to use the default policy.
If you go through the pain of designing independent computation units, you probably don't expect them to run sequentially while half a dozen CPUs twiddle their thumbs, which can "legally" happen depending on the compiler you choose.
The implicit assumption of the default behaviour is that some sophisticated thread pool mechanism will optimize task placement (possibly letting some run sequentially on the caller's CPU), but that is pure phantasy, since nothing specifies what the C++ runtime must do (which would go way beyond the scope of a compiler runtime anyway).
This looks more like undefined behaviour by design to me.
A class named "async" should launch asynchronous execution units, unless some explicit and deterministic behaviour parameter tells it otherwise.
Frankly, except for debugging purpose, I can't see a use for launch::deferred
, unless you plan on writing your own pseudo-scheduler, in which case you'll be better off using plain threads.
So my advice would be to specify launch::async
when you use async
, (telling the compiler something like "hey, I want some async task, but really async, ok?") and not to use async
at all if you just want to execute tasks sequentially.
If you run into trouble with your async tasks, it can be convenient to revert to deferred
policy to debug them more easily, but that's about it.