1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // UNSUPPORTED: libcpp-has-no-threads 10 11 // <condition_variable> 12 13 // class condition_variable; 14 15 // void notify_one(); 16 17 #include <condition_variable> 18 #include <atomic> 19 #include <mutex> 20 #include <thread> 21 #include <cassert> 22 23 #include "test_macros.h" 24 25 26 std::condition_variable cv; 27 std::mutex mut; 28 29 std::atomic_int test1(0); 30 std::atomic_int test2(0); 31 32 void f1() 33 { 34 std::unique_lock<std::mutex> lk(mut); 35 assert(test1 == 0); 36 while (test1 == 0) 37 cv.wait(lk); 38 assert(test1 == 1); 39 test1 = 2; 40 } 41 42 void f2() 43 { 44 std::unique_lock<std::mutex> lk(mut); 45 assert(test2 == 0); 46 while (test2 == 0) 47 cv.wait(lk); 48 assert(test2 == 1); 49 test2 = 2; 50 } 51 52 int main(int, char**) 53 { 54 std::thread t1(f1); 55 std::thread t2(f2); 56 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 57 { 58 std::unique_lock<std::mutex>lk(mut); 59 test1 = 1; 60 test2 = 1; 61 } 62 cv.notify_one(); 63 { 64 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 65 std::unique_lock<std::mutex>lk(mut); 66 } 67 if (test1 == 2) 68 { 69 assert(test2 == 1); 70 t1.join(); 71 test1 = 0; 72 } 73 else if (test2 == 2) 74 { 75 assert(test1 == 1); 76 t2.join(); 77 test2 = 0; 78 } 79 else 80 assert(false); 81 cv.notify_one(); 82 { 83 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 84 std::unique_lock<std::mutex>lk(mut); 85 } 86 if (test1 == 2) 87 { 88 assert(test2 == 0); 89 t1.join(); 90 test1 = 0; 91 } 92 else if (test2 == 2) 93 { 94 assert(test1 == 0); 95 t2.join(); 96 test2 = 0; 97 } 98 else 99 assert(false); 100 101 return 0; 102 } 103