]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/thread/example/future_when_all.cpp
1 // Copyright (C) 2012-2013 Vicente Botet
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)
6 #include <boost/config.hpp>
8 #if ! defined BOOST_NO_CXX11_DECLTYPE
9 #define BOOST_RESULT_OF_USE_DECLTYPE
13 #define BOOST_THREAD_VERSION 4
14 //#define BOOST_THREAD_USES_LOG
15 #define BOOST_THREAD_USES_LOG_THREAD_ID
17 #include <boost/thread/future.hpp>
18 #include <boost/thread/csbl/vector.hpp>
19 #include <boost/assert.hpp>
20 #include <boost/thread/detail/log.hpp>
22 #if defined BOOST_THREAD_PROVIDES_FUTURE_WHEN_ALL_WHEN_ANY
25 #pragma warning(disable: 4127) // conditional expression is constant
31 << "P1" << BOOST_THREAD_END_LOG
;
32 boost::this_thread::sleep_for(boost::chrono::seconds(1));
38 << "P1b" << BOOST_THREAD_END_LOG
;
39 boost::this_thread::sleep_for(boost::chrono::seconds(1));
43 int p2(boost::future
<int> f
)
46 << " P2 " << BOOST_THREAD_END_LOG
;
51 catch (std::exception
& ex
)
54 << "ERRORRRRR " << ex
.what() << "" << BOOST_THREAD_END_LOG
;
60 << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG
;
64 << "P2>" << BOOST_THREAD_END_LOG
;
68 int p2s(boost::shared_future
<int> f
)
71 << "<P2" << BOOST_THREAD_END_LOG
;
76 catch (std::exception
& ex
)
79 << "ERRORRRRR " << ex
.what() << "" << BOOST_THREAD_END_LOG
;
85 << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG
;
89 << "P2>" << BOOST_THREAD_END_LOG
;
96 << "<MAIN" << BOOST_THREAD_END_LOG
;
101 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
102 boost::future
<boost::csbl::tuple
<> > all0
= boost::when_all();
104 << BOOST_THREAD_END_LOG
;
107 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
108 boost::future
<int> f1
= boost::async(boost::launch::async
, &p1
);
109 boost::future
<boost::csbl::tuple
<boost::future
<int> > > all
= boost::when_all(boost::move(f1
));
110 boost::csbl::tuple
<boost::future
<int> > res
= all
.get();
112 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
114 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
116 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
117 boost::future
<int> f1
= boost::async(boost::launch::deferred
, &p1
);
118 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
119 boost::future
<boost::csbl::tuple
<boost::future
<int> > > all
= boost::when_all(boost::move(f1
));
120 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
121 boost::csbl::tuple
<boost::future
<int> > res
= all
.get();
123 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
127 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
128 boost::future
<int> f1
= boost::make_ready_future(1);
129 boost::future
<boost::csbl::tuple
<boost::future
<int> > > all
= boost::when_all(boost::move(f1
));
130 boost::csbl::tuple
<boost::future
<int> > res
= all
.get();
132 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
135 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
136 boost::future
<int> f1
= boost::async(boost::launch::async
, &p1
);
137 boost::future
<int> f2
= boost::async(boost::launch::async
, &p1b
);
138 boost::future
<boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > > all
= boost::when_all(boost::move(f1
), boost::move(f2
));
140 boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > res
= all
.get();
142 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
144 << boost::csbl::get
<1>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
147 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
148 boost::future
<int> f1
= boost::async(boost::launch::async
, &p1
);
149 boost::future
<std::string
> f2
= boost::make_ready_future(std::string("nnnnnnn"));;
150 boost::future
<boost::csbl::tuple
<boost::future
<int>, boost::future
<std::string
> > > all
= boost::when_all(boost::move(f1
), boost::move(f2
));
152 boost::csbl::tuple
<boost::future
<int>, boost::future
<std::string
> > res
= all
.get();
154 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
156 << boost::csbl::get
<1>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
159 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
160 boost::csbl::vector
<boost::future
<int> > v
;
161 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
162 v
.push_back(boost::async(boost::launch::async
, &p1
));
163 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
164 v
.push_back(boost::async(boost::launch::async
, &p1b
));
165 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
166 boost::future
<boost::csbl::vector
<boost::future
<int> > > all
= boost::when_all(v
.begin(), v
.end());
167 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
168 boost::csbl::vector
<boost::future
<int> > res
= all
.get();
170 << res
[0].get() <<" " << BOOST_THREAD_END_LOG
;
172 << res
[1].get() <<" " << BOOST_THREAD_END_LOG
;
175 catch (std::exception
& ex
)
178 << "ERRORRRRR " << ex
.what() << "" << BOOST_THREAD_END_LOG
;
184 << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG
;
192 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
193 boost::future
<boost::csbl::tuple
<> > all0
= boost::when_any();
194 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
197 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
198 boost::future
<int> f1
= boost::async(boost::launch::async
, &p1
);
199 boost::future
<boost::csbl::tuple
<boost::future
<int> > > all
= boost::when_any(boost::move(f1
));
200 boost::csbl::tuple
<boost::future
<int> > res
= all
.get();
202 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
204 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
206 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
207 boost::future
<int> f1
= boost::async(boost::launch::deferred
, &p1
);
208 boost::future
<boost::csbl::tuple
<boost::future
<int> > > all
= boost::when_any(boost::move(f1
));
209 boost::csbl::tuple
<boost::future
<int> > res
= all
.get();
211 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
215 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
216 boost::future
<int> f1
= boost::async(boost::launch::async
, &p1
);
217 boost::future
<int> f2
= boost::async(boost::launch::async
, &p1b
);
218 boost::future
<boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > > all
= boost::when_any(boost::move(f1
), boost::move(f2
));
219 boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > res
= all
.get();
221 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
223 << boost::csbl::get
<1>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
226 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
227 boost::future
<int> f1
= boost::make_ready_future(1);
228 boost::future
<int> f2
= boost::async(boost::launch::async
, &p1b
);
229 boost::future
<boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > > all
= boost::when_any(boost::move(f1
), boost::move(f2
));
230 boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > res
= all
.get();
232 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
234 << boost::csbl::get
<1>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
237 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
238 boost::future
<std::string
> f1
= boost::make_ready_future(std::string("aaaa"));
239 boost::future
<int> f2
= boost::async(boost::launch::async
, &p1b
);
240 boost::future
<boost::csbl::tuple
<boost::future
<std::string
>,boost::future
<int> > > all
= boost::when_any(boost::move(f1
), boost::move(f2
));
241 boost::csbl::tuple
<boost::future
<std::string
>,boost::future
<int> > res
= all
.get();
243 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
245 << boost::csbl::get
<1>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
248 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
249 boost::future
<int> f2
= boost::make_ready_future(1);
250 boost::future
<int> f1
= boost::async(boost::launch::async
, &p1b
);
251 boost::future
<boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > > all
= boost::when_any(boost::move(f1
), boost::move(f2
));
252 boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > res
= all
.get();
254 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
256 << boost::csbl::get
<1>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
258 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
260 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
261 boost::future
<int> f1
= boost::async(boost::launch::deferred
, &p1
);
262 boost::future
<int> f2
= boost::async(boost::launch::async
, &p1b
);
263 boost::future
<boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > > all
= boost::when_any(boost::move(f1
), boost::move(f2
));
264 boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > res
= all
.get();
266 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
268 << boost::csbl::get
<1>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
271 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
272 boost::future
<int> f1
= boost::async(boost::launch::async
, &p1
);
273 boost::future
<int> f2
= boost::async(boost::launch::deferred
, &p1b
);
274 boost::future
<boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > > all
= boost::when_any(boost::move(f1
), boost::move(f2
));
275 boost::csbl::tuple
<boost::future
<int>,boost::future
<int> > res
= all
.get();
277 << boost::csbl::get
<0>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
279 << boost::csbl::get
<1>(res
).get() <<" " << BOOST_THREAD_END_LOG
;
283 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
284 boost::csbl::vector
<boost::future
<int> > v
;
285 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
286 v
.push_back(boost::async(boost::launch::async
, &p1
));
287 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
288 v
.push_back(boost::async(boost::launch::async
, &p1b
));
289 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
290 boost::future
<boost::csbl::vector
<boost::future
<int> > > all
= boost::when_any(v
.begin(), v
.end());
291 BOOST_THREAD_LOG
<< BOOST_THREAD_END_LOG
;
292 boost::csbl::vector
<boost::future
<int> > res
= all
.get();
294 << res
[0].get() <<" " << BOOST_THREAD_END_LOG
;
296 << res
[1].get() <<" " << BOOST_THREAD_END_LOG
;
299 catch (std::exception
& ex
)
302 << "ERRORRRRR " << ex
.what() << "" << BOOST_THREAD_END_LOG
;
308 << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG
;
313 << "MAIN>" << BOOST_THREAD_END_LOG
;
317 #include <boost/thread/csbl/vector.hpp>
318 using namespace boost
;
320 void f( boost::csbl::vector
<future
<int> > &//vec
321 , BOOST_THREAD_RV_REF(future
<int>) //f
326 boost::csbl::vector
<future
<int> > vec
;
327 f(vec
, make_ready_future(0));