//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: no-threads // // Make sure std::unique_lock works with std::mutex as expected. #include #include #include #include "make_test_thread.h" std::atomic keep_waiting; std::atomic child_thread_locked; std::mutex mux; bool main_thread_unlocked = false; bool child_thread_unlocked = false; void lock_thread() { std::unique_lock lock(mux); assert(main_thread_unlocked); main_thread_unlocked = false; child_thread_unlocked = true; } void try_lock_thread() { std::unique_lock lock(mux, std::try_to_lock_t()); assert(lock.owns_lock()); child_thread_locked = true; while (keep_waiting) std::this_thread::sleep_for(std::chrono::milliseconds(10)); child_thread_unlocked = true; } int main(int, char**) { { mux.lock(); std::thread t = support::make_test_thread(lock_thread); main_thread_unlocked = true; mux.unlock(); t.join(); assert(child_thread_unlocked); } { child_thread_unlocked = false; child_thread_locked = false; keep_waiting = true; std::thread t = support::make_test_thread(try_lock_thread); while (!child_thread_locked) std::this_thread::sleep_for(std::chrono::milliseconds(10)); assert(!mux.try_lock()); keep_waiting = false; t.join(); assert(child_thread_unlocked); } return 0; }