1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // UNSUPPORTED: libcpp-has-no-threads
11 
12 // <condition_variable>
13 
14 // class condition_variable;
15 
16 // ~condition_variable();
17 
18 #include <condition_variable>
19 #include <mutex>
20 #include <thread>
21 #include <cassert>
22 
23 std::condition_variable* cv;
24 std::mutex m;
25 typedef std::unique_lock<std::mutex> Lock;
26 
27 bool f_ready = false;
28 bool g_ready = false;
29 
f()30 void f()
31 {
32     Lock lk(m);
33     f_ready = true;
34     cv->notify_one();
35     delete cv;
36 }
37 
g()38 void g()
39 {
40     Lock lk(m);
41     g_ready = true;
42     cv->notify_one();
43     while (!f_ready)
44         cv->wait(lk);
45 }
46 
main()47 int main()
48 {
49     cv = new std::condition_variable;
50     std::thread th2(g);
51     Lock lk(m);
52     while (!g_ready)
53         cv->wait(lk);
54     lk.unlock();
55     std::thread th1(f);
56     th1.join();
57     th2.join();
58 }
59