| #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); | |
| } |