https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60966
--- Comment #17 from Hideaki Kimura <hideaki.kimura at gmail dot com> --- (In reply to Jonathan Wakely from comment #16) > promise::get_future() is a non-const function that modifies the promise > object, therefore it must not be called while any other object is accessing > the promise. Oh, is it the design of promise::get_future/set_value? I so far don't see any reference that clarifies either way (most document just mentions about difference between future/shared_future) Taking a glance at boost::promise code, I got an impression that their code is safe against concurrent get_future() and set_value() because get_future() either does atomic swap in lazy_init() or does nothing (allocated in constructor). I guess that's why Thomas observed that the issue doesn't happen in boost::promise. I'm not sure what the C++ standard says. I haven't seen a single human being who has read it through.