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
21std::atomic<bool> keep_waiting;
22std::atomic<bool> child_thread_locked;
23std::mutex mux;
24bool main_thread_unlocked = false;
25bool child_thread_unlocked = false;
26
27void 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
34void 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
45int 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

source code of libcxx/test/std/thread/thread.mutex/thread.lock/thread.lock.unique/mutex.pass.cpp