1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // UNSUPPORTED: libcpp-has-no-threads
11 // UNSUPPORTED: c++03, c++98, c++11, c++14
12 
13 // <shared_mutex>
14 
15 // class shared_mutex;
16 
17 // bool try_lock();
18 
19 #include <shared_mutex>
20 #include <thread>
21 #include <cstdlib>
22 #include <cassert>
23 
24 std::shared_mutex m;
25 
26 typedef std::chrono::system_clock Clock;
27 typedef Clock::time_point time_point;
28 typedef Clock::duration duration;
29 typedef std::chrono::milliseconds ms;
30 typedef std::chrono::nanoseconds ns;
31 
f()32 void f()
33 {
34     time_point t0 = Clock::now();
35     assert(!m.try_lock());
36     assert(!m.try_lock());
37     assert(!m.try_lock());
38     while(!m.try_lock())
39         ;
40     time_point t1 = Clock::now();
41     m.unlock();
42     ns d = t1 - t0 - ms(250);
43     assert(d < ms(200));  // within 200ms
44 }
45 
main()46 int main()
47 {
48     m.lock();
49     std::thread t(f);
50     std::this_thread::sleep_for(ms(250));
51     m.unlock();
52     t.join();
53 }
54