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
27int p1()
28{
29 BOOST_THREAD_LOG << "P1" << BOOST_THREAD_END_LOG;
30 return 123;
31}
32
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}
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
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(f: &p1);
86 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
87 boost::future<int> f2 = f1.then(func: &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(f: &p1).share();
110 BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
111 boost::future<int> f2 = f1.then(func: &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
133int main()
134{
135 return 0;
136}
137#endif
138

source code of boost/libs/thread/example/future_then.cpp