//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // Copyright (C) 2011 Vicente J. Botet Escriba // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // template // future::type> // async(F&& f, Args&&... args); // template // future::type> // async(launch policy, F&& f, Args&&... args); //#define BOOST_THREAD_VERSION 3 #define BOOST_THREAD_VERSION 4 #include #include #include #include #include #include typedef boost::chrono::high_resolution_clock Clock; typedef boost::chrono::milliseconds ms; class A { long data_; public: typedef long result_type; explicit A(long i) : data_(i) {} long operator()() const { boost::this_thread::sleep_for(ms(200)); return data_; } }; class MoveOnly { public: typedef int result_type; BOOST_THREAD_MOVABLE_ONLY(MoveOnly) MoveOnly() { } MoveOnly(BOOST_THREAD_RV_REF(MoveOnly)) {} int operator()() { boost::this_thread::sleep_for(ms(200)); return 3; } }; int f0() { boost::this_thread::sleep_for(ms(200)); return 3; } int i = 0; int& f1() { boost::this_thread::sleep_for(ms(200)); return i; } void f2() { boost::this_thread::sleep_for(ms(200)); } boost::interprocess::unique_ptr > f3(int i) { boost::this_thread::sleep_for(ms(200)); return boost::interprocess::unique_ptr >(new int(i)); } boost::interprocess::unique_ptr > f4( BOOST_THREAD_RV_REF_BEG boost::interprocess::unique_ptr > BOOST_THREAD_RV_REF_END p ) { boost::this_thread::sleep_for(ms(200)); return boost::move(p); } int main() { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(f0); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(f.get() == 3); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::async, f0); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(f.get() == 3); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::async, A(3)); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(f.get() == 3); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::async, BOOST_THREAD_MAKE_RV_REF(MoveOnly())); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(f.get() == 3); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::any, f0); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(f.get() == 3); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::deferred, f0); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(f.get() == 3); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 > ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(f1); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(&f.get() == &i); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::async, f1); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(&f.get() == &i); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::any, f1); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(&f.get() == &i); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::deferred, f1); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(&f.get() == &i); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 > ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(f2); std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::async, f2); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); f.get(); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::any, f2); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); f.get(); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< f = boost::async(boost::launch::deferred, f2); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); f.get(); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 > ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< > > f = boost::async(boost::launch::async, &f3, 3); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(*f.get() == 3); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"< > > f = boost::async(&f4, boost::interprocess::unique_ptr >(new int(3))); boost::this_thread::sleep_for(ms(300)); Clock::time_point t0 = Clock::now(); BOOST_TEST(*f.get() == 3); Clock::time_point t1 = Clock::now(); BOOST_TEST(t1 - t0 < ms(100)); } catch (std::exception& ex) { std::cout << __FILE__ <<"["<<__LINE__<<"]"<