1ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//===----------------------------------------------------------------------===// 2ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// 3ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// The LLVM Compiler Infrastructure 4ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// 5ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// 8ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant//===----------------------------------------------------------------------===// 9ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 10ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// <shared_mutex> 11ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 12f9f95be93091c60e7c9034670f298d5a2fba8686David Majnemer// class shared_timed_mutex; 13ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 14ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// template <class Clock, class Duration> 15ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant// shared_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time); 16ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 17ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <shared_mutex> 18ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <thread> 19ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <vector> 20ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <cstdlib> 21ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#include <cassert> 22ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 23ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#if _LIBCPP_STD_VER > 11 24ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 25f9f95be93091c60e7c9034670f298d5a2fba8686David Majnemerstd::shared_timed_mutex m; 26ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 27ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef std::chrono::steady_clock Clock; 28ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef Clock::time_point time_point; 29ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef Clock::duration duration; 30ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef std::chrono::milliseconds ms; 31ba898e42081aec544a04d282834aa99b13d57803Howard Hinnanttypedef std::chrono::nanoseconds ns; 32ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 33ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantvoid f1() 34ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant{ 35ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant time_point t0 = Clock::now(); 36f9f95be93091c60e7c9034670f298d5a2fba8686David Majnemer std::shared_lock<std::shared_timed_mutex> lk(m, Clock::now() + ms(300)); 37ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant assert(lk.owns_lock() == true); 38ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant time_point t1 = Clock::now(); 39ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant ns d = t1 - t0 - ms(250); 40ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant assert(d < ns(50000000)); // within 50ms 41ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant} 42ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 43ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantvoid f2() 44ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant{ 45ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant time_point t0 = Clock::now(); 46f9f95be93091c60e7c9034670f298d5a2fba8686David Majnemer std::shared_lock<std::shared_timed_mutex> lk(m, Clock::now() + ms(250)); 47ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant assert(lk.owns_lock() == false); 48ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant time_point t1 = Clock::now(); 49ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant ns d = t1 - t0 - ms(250); 50ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant assert(d < ms(50)); // within 50ms 51ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant} 52ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 53ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#endif // _LIBCPP_STD_VER > 11 54ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant 55ba898e42081aec544a04d282834aa99b13d57803Howard Hinnantint main() 56ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant{ 57ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#if _LIBCPP_STD_VER > 11 58ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant { 59ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant m.lock(); 60ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant std::vector<std::thread> v; 61ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant for (int i = 0; i < 5; ++i) 62ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant v.push_back(std::thread(f1)); 63ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant std::this_thread::sleep_for(ms(250)); 64ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant m.unlock(); 65ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant for (auto& t : v) 66ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant t.join(); 67ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant } 68ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant { 69ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant m.lock(); 70ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant std::vector<std::thread> v; 71ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant for (int i = 0; i < 5; ++i) 72ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant v.push_back(std::thread(f2)); 73ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant std::this_thread::sleep_for(ms(300)); 74ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant m.unlock(); 75ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant for (auto& t : v) 76ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant t.join(); 77ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant } 78ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant#endif // _LIBCPP_STD_VER > 11 79ba898e42081aec544a04d282834aa99b13d57803Howard Hinnant} 80