#include <thread> #include <condition_variable> #include <mutex> #include <chrono> #include <iostream> #include <cassert> void f1() { std::exit(0); } struct Mutex { unsigned state = 0; Mutex() = default; ~Mutex() = default; Mutex(const Mutex&) = delete; Mutex& operator=(const Mutex&) = delete; void lock() { if (++state == 2) throw 1; // this throw should end up calling terminate() } void unlock() {} }; Mutex mut; std::condition_variable_any cv; void signal_me() { std::this_thread::sleep_for(std::chrono::milliseconds(500)); cv.notify_one(); } int main() { std::set_terminate(f1); try { std::thread(signal_me).detach(); mut.lock(); cv.wait(mut); } catch (...) {} assert(false); }