future_then.cpp 3.4 KB

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