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 // <future> 11 12 // template <class F, class... Args> 13 // future<typename result_of<F(Args...)>::type> 14 // async(F&& f, Args&&... args); 15 16 // template <class F, class... Args> 17 // future<typename result_of<F(Args...)>::type> 18 // async(launch policy, F&& f, Args&&... args); 19 20 #include <future> 21 #include <memory> 22 #include <cassert> 23 24 typedef std::chrono::high_resolution_clock Clock; 25 typedef std::chrono::milliseconds ms; 26 27 int f0() 28 { 29 std::this_thread::sleep_for(ms(200)); 30 return 3; 31 } 32 33 int i = 0; 34 35 int& f1() 36 { 37 std::this_thread::sleep_for(ms(200)); 38 return i; 39 } 40 41 void f2() 42 { 43 std::this_thread::sleep_for(ms(200)); 44 } 45 46 std::unique_ptr<int> f3(int i) 47 { 48 std::this_thread::sleep_for(ms(200)); 49 return std::unique_ptr<int>(new int(i)); 50 } 51 52 std::unique_ptr<int> f4(std::unique_ptr<int>&& p) 53 { 54 std::this_thread::sleep_for(ms(200)); 55 return std::move(p); 56 } 57 58 int main() 59 { 60 { 61 std::future<int> f = std::async(f0); 62 std::this_thread::sleep_for(ms(300)); 63 Clock::time_point t0 = Clock::now(); 64 assert(f.get() == 3); 65 Clock::time_point t1 = Clock::now(); 66 assert(t1-t0 < ms(100)); 67 } 68 { 69 std::future<int> f = std::async(std::launch::async, f0); 70 std::this_thread::sleep_for(ms(300)); 71 Clock::time_point t0 = Clock::now(); 72 assert(f.get() == 3); 73 Clock::time_point t1 = Clock::now(); 74 assert(t1-t0 < ms(100)); 75 } 76 { 77 std::future<int> f = std::async(std::launch::any, f0); 78 std::this_thread::sleep_for(ms(300)); 79 Clock::time_point t0 = Clock::now(); 80 assert(f.get() == 3); 81 Clock::time_point t1 = Clock::now(); 82 assert(t1-t0 < ms(100)); 83 } 84 { 85 std::future<int> f = std::async(std::launch::deferred, f0); 86 std::this_thread::sleep_for(ms(300)); 87 Clock::time_point t0 = Clock::now(); 88 assert(f.get() == 3); 89 Clock::time_point t1 = Clock::now(); 90 assert(t1-t0 > ms(100)); 91 } 92 93 { 94 std::future<int&> f = std::async(f1); 95 std::this_thread::sleep_for(ms(300)); 96 Clock::time_point t0 = Clock::now(); 97 assert(&f.get() == &i); 98 Clock::time_point t1 = Clock::now(); 99 assert(t1-t0 < ms(100)); 100 } 101 { 102 std::future<int&> f = std::async(std::launch::async, f1); 103 std::this_thread::sleep_for(ms(300)); 104 Clock::time_point t0 = Clock::now(); 105 assert(&f.get() == &i); 106 Clock::time_point t1 = Clock::now(); 107 assert(t1-t0 < ms(100)); 108 } 109 { 110 std::future<int&> f = std::async(std::launch::any, f1); 111 std::this_thread::sleep_for(ms(300)); 112 Clock::time_point t0 = Clock::now(); 113 assert(&f.get() == &i); 114 Clock::time_point t1 = Clock::now(); 115 assert(t1-t0 < ms(100)); 116 } 117 { 118 std::future<int&> f = std::async(std::launch::deferred, f1); 119 std::this_thread::sleep_for(ms(300)); 120 Clock::time_point t0 = Clock::now(); 121 assert(&f.get() == &i); 122 Clock::time_point t1 = Clock::now(); 123 assert(t1-t0 > ms(100)); 124 } 125 126 { 127 std::future<void> f = std::async(f2); 128 std::this_thread::sleep_for(ms(300)); 129 Clock::time_point t0 = Clock::now(); 130 f.get(); 131 Clock::time_point t1 = Clock::now(); 132 assert(t1-t0 < ms(100)); 133 } 134 { 135 std::future<void> f = std::async(std::launch::async, f2); 136 std::this_thread::sleep_for(ms(300)); 137 Clock::time_point t0 = Clock::now(); 138 f.get(); 139 Clock::time_point t1 = Clock::now(); 140 assert(t1-t0 < ms(100)); 141 } 142 { 143 std::future<void> f = std::async(std::launch::any, f2); 144 std::this_thread::sleep_for(ms(300)); 145 Clock::time_point t0 = Clock::now(); 146 f.get(); 147 Clock::time_point t1 = Clock::now(); 148 assert(t1-t0 < ms(100)); 149 } 150 { 151 std::future<void> f = std::async(std::launch::deferred, f2); 152 std::this_thread::sleep_for(ms(300)); 153 Clock::time_point t0 = Clock::now(); 154 f.get(); 155 Clock::time_point t1 = Clock::now(); 156 assert(t1-t0 > ms(100)); 157 } 158 159 { 160 std::future<std::unique_ptr<int>> f = std::async(f3, 3); 161 std::this_thread::sleep_for(ms(300)); 162 Clock::time_point t0 = Clock::now(); 163 assert(*f.get() == 3); 164 Clock::time_point t1 = Clock::now(); 165 assert(t1-t0 < ms(100)); 166 } 167 168 { 169 std::future<std::unique_ptr<int>> f = 170 std::async(f4, std::unique_ptr<int>(new int(3))); 171 std::this_thread::sleep_for(ms(300)); 172 Clock::time_point t0 = Clock::now(); 173 assert(*f.get() == 3); 174 Clock::time_point t1 = Clock::now(); 175 assert(t1-t0 < ms(100)); 176 } 177 } 178