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: no-threads 10 11 // <mutex> 12 13 // Make sure std::unique_lock works with std::mutex as expected. 14 15 #include <atomic> 16 #include <cassert> 17 #include <mutex> 18 19 #include "make_test_thread.h" 20 21 std::atomic<bool> keep_waiting; 22 std::atomic<bool> child_thread_locked; 23 std::mutex mux; 24 bool main_thread_unlocked = false; 25 bool child_thread_unlocked = false; 26 27 void lock_thread() { 28 std::unique_lock<std::mutex> lock(mux); 29 assert(main_thread_unlocked); 30 main_thread_unlocked = false; 31 child_thread_unlocked = true; 32 } 33 34 void try_lock_thread() { 35 std::unique_lock<std::mutex> lock(mux, std::try_to_lock_t()); 36 assert(lock.owns_lock()); 37 child_thread_locked = true; 38 39 while (keep_waiting) 40 std::this_thread::sleep_for(std::chrono::milliseconds(10)); 41 42 child_thread_unlocked = true; 43 } 44 45 int main(int, char**) { 46 { 47 mux.lock(); 48 std::thread t = support::make_test_thread(lock_thread); 49 main_thread_unlocked = true; 50 mux.unlock(); 51 t.join(); 52 assert(child_thread_unlocked); 53 } 54 55 { 56 child_thread_unlocked = false; 57 child_thread_locked = false; 58 keep_waiting = true; 59 std::thread t = support::make_test_thread(try_lock_thread); 60 while (!child_thread_locked) 61 std::this_thread::sleep_for(std::chrono::milliseconds(10)); 62 assert(!mux.try_lock()); 63 keep_waiting = false; 64 t.join(); 65 assert(child_thread_unlocked); 66 } 67 68 return 0; 69 } 70