15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 3*57b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*57b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*57b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier // 95a83710eSEric Fiselier // UNSUPPORTED: libcpp-has-no-threads 105a83710eSEric Fiselier 115a83710eSEric Fiselier // <condition_variable> 125a83710eSEric Fiselier 135a83710eSEric Fiselier // class condition_variable; 145a83710eSEric Fiselier 155a83710eSEric Fiselier // void notify_one(); 165a83710eSEric Fiselier 175a83710eSEric Fiselier #include <condition_variable> 1892499e45SEric Fiselier #include <atomic> 195a83710eSEric Fiselier #include <mutex> 205a83710eSEric Fiselier #include <thread> 215a83710eSEric Fiselier #include <cassert> 225a83710eSEric Fiselier 2310967a6eSEric Fiselier 245a83710eSEric Fiselier std::condition_variable cv; 255a83710eSEric Fiselier std::mutex mut; 265a83710eSEric Fiselier 2792499e45SEric Fiselier std::atomic_int test1(0); 2892499e45SEric Fiselier std::atomic_int test2(0); 295a83710eSEric Fiselier 305a83710eSEric Fiselier void f1() 315a83710eSEric Fiselier { 325a83710eSEric Fiselier std::unique_lock<std::mutex> lk(mut); 335a83710eSEric Fiselier assert(test1 == 0); 345a83710eSEric Fiselier while (test1 == 0) 355a83710eSEric Fiselier cv.wait(lk); 365a83710eSEric Fiselier assert(test1 == 1); 375a83710eSEric Fiselier test1 = 2; 385a83710eSEric Fiselier } 395a83710eSEric Fiselier 405a83710eSEric Fiselier void f2() 415a83710eSEric Fiselier { 425a83710eSEric Fiselier std::unique_lock<std::mutex> lk(mut); 435a83710eSEric Fiselier assert(test2 == 0); 445a83710eSEric Fiselier while (test2 == 0) 455a83710eSEric Fiselier cv.wait(lk); 465a83710eSEric Fiselier assert(test2 == 1); 475a83710eSEric Fiselier test2 = 2; 485a83710eSEric Fiselier } 495a83710eSEric Fiselier 505a83710eSEric Fiselier int main() 515a83710eSEric Fiselier { 525a83710eSEric Fiselier std::thread t1(f1); 535a83710eSEric Fiselier std::thread t2(f2); 545a83710eSEric Fiselier std::this_thread::sleep_for(std::chrono::milliseconds(100)); 555a83710eSEric Fiselier { 565a83710eSEric Fiselier std::unique_lock<std::mutex>lk(mut); 575a83710eSEric Fiselier test1 = 1; 585a83710eSEric Fiselier test2 = 1; 595a83710eSEric Fiselier } 605a83710eSEric Fiselier cv.notify_one(); 615a83710eSEric Fiselier { 625a83710eSEric Fiselier std::this_thread::sleep_for(std::chrono::milliseconds(100)); 635a83710eSEric Fiselier std::unique_lock<std::mutex>lk(mut); 645a83710eSEric Fiselier } 655a83710eSEric Fiselier if (test1 == 2) 665a83710eSEric Fiselier { 6710967a6eSEric Fiselier assert(test2 == 1); 685a83710eSEric Fiselier t1.join(); 695a83710eSEric Fiselier test1 = 0; 705a83710eSEric Fiselier } 715a83710eSEric Fiselier else if (test2 == 2) 725a83710eSEric Fiselier { 7310967a6eSEric Fiselier assert(test1 == 1); 745a83710eSEric Fiselier t2.join(); 755a83710eSEric Fiselier test2 = 0; 765a83710eSEric Fiselier } 775a83710eSEric Fiselier else 785a83710eSEric Fiselier assert(false); 795a83710eSEric Fiselier cv.notify_one(); 805a83710eSEric Fiselier { 815a83710eSEric Fiselier std::this_thread::sleep_for(std::chrono::milliseconds(100)); 825a83710eSEric Fiselier std::unique_lock<std::mutex>lk(mut); 835a83710eSEric Fiselier } 845a83710eSEric Fiselier if (test1 == 2) 855a83710eSEric Fiselier { 8610967a6eSEric Fiselier assert(test2 == 0); 875a83710eSEric Fiselier t1.join(); 885a83710eSEric Fiselier test1 = 0; 895a83710eSEric Fiselier } 905a83710eSEric Fiselier else if (test2 == 2) 915a83710eSEric Fiselier { 9210967a6eSEric Fiselier assert(test1 == 0); 935a83710eSEric Fiselier t2.join(); 945a83710eSEric Fiselier test2 = 0; 955a83710eSEric Fiselier } 965a83710eSEric Fiselier else 975a83710eSEric Fiselier assert(false); 985a83710eSEric Fiselier } 99