xref: /llvm-project/libcxx/test/std/thread/thread.mutex/thread.lock/thread.lock.unique/mutex.pass.cpp (revision 9ff0468436c957fadcd8926683696a879cbc78a0)
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