1#include <thread> 2#include <condition_variable> 3#include <mutex> 4#include <chrono> 5#include <iostream> 6#include <cassert> 7 8void f1() 9{ 10 std::exit(0); 11} 12 13struct Mutex 14{ 15 unsigned state = 0; 16 Mutex() = default; 17 ~Mutex() = default; 18 Mutex(const Mutex&) = delete; 19 Mutex& operator=(const Mutex&) = delete; 20 21 void lock() 22 { 23 if (++state == 2) 24 throw 1; // this throw should end up calling terminate() 25 } 26 27 void unlock() {} 28}; 29 30Mutex mut; 31std::condition_variable_any cv; 32 33void 34signal_me() 35{ 36 std::this_thread::sleep_for(std::chrono::milliseconds(500)); 37 cv.notify_one(); 38} 39 40int 41main() 42{ 43 std::set_terminate(f1); 44 try 45 { 46 std::thread(signal_me).detach(); 47 mut.lock(); 48 cv.wait(mut); 49 } 50 catch (...) {} 51 assert(false); 52} 53