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