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