https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99356
Bug ID: 99356 Summary: Recursive std::shared_future:s with std::launch::deferred sporadically deadlock Product: gcc Version: 10.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: fiesh at zefix dot tv Target Milestone: --- Trying to sail around 97949, we switched to using std::shared_future combined with std::launch::deferred instead of using std::call_once. Now again this leads to sporadic deadlocks under Windows. The following code exemplifies the behavior: ---------------------------------------- #include <chrono> #include <future> #include <iostream> #include <thread> int main() { auto const future0 = std::shared_future<void>{std::async(std::launch::deferred, []() { using namespace std::chrono_literals; std::cout << "future0 running..." << std::endl; std::this_thread::sleep_for(1s); std::cout << "future0 done." << std::endl; })}; auto const future1 = std::shared_future<void>{std::async(std::launch::deferred, [future0]() { std::cout << "future0 running..." << std::endl; future0.get(); std::cout << "future0 done." << std::endl; })}; auto const getFuture = [future1]() { std::cout << "getting future1..." << std::endl; future1.get(); std::cout << "got future1." << std::endl; }; std::thread t0(getFuture); std::thread t1(getFuture); t0.join(); t1.join(); std::cout << "done" << std::endl; } ---------------------------------------- If there's a workaround, we'd be very grateful.