• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 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 // futtest.cpp
7 #include <iostream>
8 #define BOOST_THREAD_VERSION 4
9 
10 #include <boost/thread/future.hpp>
11 #include <boost/thread/thread.hpp>
12 #include <boost/bind/bind.hpp>
13 #include <boost/chrono.hpp>
14 #include <boost/shared_ptr.hpp>
15 #include <boost/scoped_ptr.hpp>
16 
17 typedef boost::shared_ptr< boost::promise<int> > IntPromise;
18 
foo(IntPromise p)19 void foo(IntPromise p)
20 {
21     std::cout << "foo" << std::endl;
22     p->set_value(123); // This line locks the future's mutex, then calls the continuation with the mutex already locked.
23 }
24 
bar(boost::future<int> fooResult)25 void bar(boost::future<int> fooResult)
26 {
27   try {
28     std::cout << "bar" << std::endl;
29     int i = fooResult.get(); // Code hangs on this line (Due to future already being locked by the set_value call)
30     std::cout << "i: " << i << std::endl;
31   } catch(...) {
32     std::cout << __FILE__ << ":" << __LINE__ << std::endl;
33   }
34 }
35 
main()36 int main()
37 {
38   std::cout << __FILE__ << ":" << __LINE__ << std::endl;
39   try {
40     IntPromise p(new boost::promise<int>());
41     boost::thread t(boost::bind(foo, p));
42     boost::future<int> f1 = p->get_future();
43     f1.then(boost::launch::deferred, &bar);
44     t.join();
45   } catch(...) {
46     return 1;
47   }
48   std::cout << __FILE__ << ":" << __LINE__ << std::endl;
49   try {
50     IntPromise p(new boost::promise<int>());
51     boost::thread t(boost::bind(foo, p));
52     boost::future<int> f1 = p->get_future();
53     f1.then(boost::launch::async, &bar);
54     t.join();
55   } catch(...) {
56     return 2;
57   }
58   std::cout << __FILE__ << ":" << __LINE__ << std::endl;
59 }
60 
61