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++98, c++03 12 13 // <future> 14 15 // class shared_future<R> 16 17 // template <class Rep, class Period> 18 // future_status 19 // wait_for(const chrono::duration<Rep, Period>& rel_time) const; 20 21 #include <future> 22 #include <cassert> 23 24 typedef std::chrono::milliseconds ms; 25 func1(std::promise<int> p)26void func1(std::promise<int> p) 27 { 28 std::this_thread::sleep_for(ms(500)); 29 p.set_value(3); 30 } 31 32 int j = 0; 33 func3(std::promise<int &> p)34void func3(std::promise<int&> p) 35 { 36 std::this_thread::sleep_for(ms(500)); 37 j = 5; 38 p.set_value(j); 39 } 40 func5(std::promise<void> p)41void func5(std::promise<void> p) 42 { 43 std::this_thread::sleep_for(ms(500)); 44 p.set_value(); 45 } 46 main()47int main() 48 { 49 typedef std::chrono::high_resolution_clock Clock; 50 { 51 typedef int T; 52 std::promise<T> p; 53 std::shared_future<T> f = p.get_future(); 54 std::thread(func1, std::move(p)).detach(); 55 assert(f.valid()); 56 assert(f.wait_for(ms(300)) == std::future_status::timeout); 57 assert(f.valid()); 58 assert(f.wait_for(ms(300)) == std::future_status::ready); 59 assert(f.valid()); 60 Clock::time_point t0 = Clock::now(); 61 f.wait(); 62 Clock::time_point t1 = Clock::now(); 63 assert(f.valid()); 64 assert(t1-t0 < ms(5)); 65 } 66 { 67 typedef int& T; 68 std::promise<T> p; 69 std::shared_future<T> f = p.get_future(); 70 std::thread(func3, std::move(p)).detach(); 71 assert(f.valid()); 72 assert(f.wait_for(ms(300)) == std::future_status::timeout); 73 assert(f.valid()); 74 assert(f.wait_for(ms(300)) == std::future_status::ready); 75 assert(f.valid()); 76 Clock::time_point t0 = Clock::now(); 77 f.wait(); 78 Clock::time_point t1 = Clock::now(); 79 assert(f.valid()); 80 assert(t1-t0 < ms(5)); 81 } 82 { 83 typedef void T; 84 std::promise<T> p; 85 std::shared_future<T> f = p.get_future(); 86 std::thread(func5, std::move(p)).detach(); 87 assert(f.valid()); 88 assert(f.wait_for(ms(300)) == std::future_status::timeout); 89 assert(f.valid()); 90 assert(f.wait_for(ms(300)) == std::future_status::ready); 91 assert(f.valid()); 92 Clock::time_point t0 = Clock::now(); 93 f.wait(); 94 Clock::time_point t1 = Clock::now(); 95 assert(f.valid()); 96 assert(t1-t0 < ms(5)); 97 } 98 } 99