1 // Copyright (C) 2012-2013 Vicente Botet 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #include <boost/config.hpp> 7 #if ! defined BOOST_NO_CXX11_DECLTYPE 8 #define BOOST_RESULT_OF_USE_DECLTYPE 9 #endif 10 11 12 #define BOOST_THREAD_VERSION 4 13 //#define BOOST_THREAD_USES_LOG 14 #define BOOST_THREAD_USES_LOG_THREAD_ID 15 16 #include <boost/thread/detail/log.hpp> 17 #include <boost/thread/future.hpp> 18 #include <boost/assert.hpp> 19 #include <string> 20 #include <iostream> 21 #if defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION 22 23 #ifdef BOOST_MSVC 24 #pragma warning(disable: 4127) // conditional expression is constant 25 #endif 26 p1()27int p1() 28 { 29 BOOST_THREAD_LOG << "P1" << BOOST_THREAD_END_LOG; 30 return 123; 31 } 32 p2(boost::future<int> f)33int p2(boost::future<int> f) 34 { 35 BOOST_THREAD_LOG << "P2<" << BOOST_THREAD_END_LOG; 36 try 37 { 38 return 2 * f.get(); 39 } 40 catch (std::exception& ex) 41 { 42 std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl; 43 BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG; 44 BOOST_ASSERT(false); 45 } 46 catch (...) 47 { 48 BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG; 49 BOOST_ASSERT(false); 50 } 51 BOOST_THREAD_LOG << "P2>" << BOOST_THREAD_END_LOG; 52 return 0; 53 } p2s(boost::shared_future<int> f)54int p2s(boost::shared_future<int> f) 55 { 56 BOOST_THREAD_LOG << "<P2S" << BOOST_THREAD_END_LOG; 57 try 58 { 59 return 2 * f.get(); 60 } 61 catch (std::exception& ex) 62 { 63 std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl; 64 BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG; 65 BOOST_ASSERT(false); 66 } 67 catch (...) 68 { 69 BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG; 70 BOOST_ASSERT(false); 71 } 72 BOOST_THREAD_LOG << "P2S>" << BOOST_THREAD_END_LOG; 73 return 0; 74 } 75 main()76int main() 77 { 78 const int number_of_tests = 100; 79 BOOST_THREAD_LOG << "<MAIN" << BOOST_THREAD_END_LOG; 80 { 81 for (int i=0; i< number_of_tests; i++) 82 try 83 { 84 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG; 85 boost::future<int> f1 = boost::async(&p1); 86 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG; 87 boost::future<int> f2 = f1.then(&p2); 88 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG; 89 (void)f2.get(); 90 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG; 91 } 92 catch (std::exception& ex) 93 { 94 std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl; 95 BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG; 96 return 1; 97 } 98 catch (...) 99 { 100 BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG; 101 return 2; 102 } 103 } 104 { 105 for (int i=0; i< number_of_tests; i++) 106 try 107 { 108 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG; 109 boost::shared_future<int> f1 = boost::async(&p1).share(); 110 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG; 111 boost::future<int> f2 = f1.then(&p2s); 112 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG; 113 (void)f2.get(); 114 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG; 115 } 116 catch (std::exception& ex) 117 { 118 std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl; 119 BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG; 120 return 1; 121 } 122 catch (...) 123 { 124 BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG; 125 return 2; 126 } 127 } 128 BOOST_THREAD_LOG << "MAIN>" << BOOST_THREAD_END_LOG; 129 return 0; 130 } 131 #else 132 main()133int main() 134 { 135 return 0; 136 } 137 #endif 138