c++ - Is std::async guaranteed to be called for functions returning void? -
i've wrote following code test std::async() on functions returning void gcc 4.8.2 on ubuntu.
#include <future> #include <iostream> void functiontbc() { std::cerr << "print here\n"; } int main(void) { #ifdef use_async auto = std::async(std::launch::async, functiontbc); #else auto = std::async(std::launch::deferred, functiontbc); #endif //i.get(); return 0; } if i.get(); uncommented, message "print here" exists; however, if i.get(); commented out, "print here" exists if , if use_async defined (that is, std::launch::async leads message printed out while std::launch::deferred never).
is guaranteed behavior? what's correct way ensure asynchronous call returning void executed?
std::launch::deferred means "do not run until .wait() or .get()".
as never .get() or .wait()ed, never ran.
void has nothing this.
for std::launch::async, standard states returned future's destructor (~future) block until task complete (ie, has implicit .wait()). violated msvc on purpose, because disagreed design decision, , fighting change standard: in practice, means cannot rely on behavior @ std::launch::async returned future if want future-proof code.
without implicit wait in ~future, indeterminate if invoked function when main exited. either have happened, or not. possibly invoke ub having still-active threads @ end of main.
you may wonder use deferred has: can use queue computation lazy evaluation.
Comments
Post a Comment