1 // (C) Copyright 2012 Howard Hinnant
2 // (C) Copyright 2012 Vicente Botet
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // adapted from the example given by Howard Hinnant in
9 #define BOOST_THREAD_VERSION 4
12 #include <boost/thread/scoped_thread.hpp>
13 #include <boost/thread/externally_locked_stream.hpp>
15 void use_cerr(boost::externally_locked_stream
<std::ostream
> &mcerr
)
17 using namespace boost
;
18 chrono::steady_clock::time_point tf
= chrono::steady_clock::now() + chrono::seconds(10);
19 while (chrono::steady_clock::now() < tf
)
21 mcerr
<< "logging data to cerr\n";
22 this_thread::sleep_for(chrono::milliseconds(500));
26 void use_cout(boost::externally_locked_stream
<std::ostream
> &mcout
)
28 using namespace boost
;
29 chrono::steady_clock::time_point tf
= chrono::steady_clock::now() + chrono::seconds(5);
30 while (chrono::steady_clock::now() < tf
)
32 mcout
<< "logging data to cout\n";
33 this_thread::sleep_for(chrono::milliseconds(250));
39 using namespace boost
;
41 recursive_mutex terminal_mutex
;
43 externally_locked_stream
<std::ostream
> mcerr(std::cerr
, terminal_mutex
);
44 externally_locked_stream
<std::ostream
> mcout(std::cout
, terminal_mutex
);
45 externally_locked_stream
<std::istream
> mcin(std::cin
, terminal_mutex
);
47 scoped_thread
<> t1(boost::thread(use_cerr
, boost::ref(mcerr
)));
48 scoped_thread
<> t2(boost::thread(use_cout
, boost::ref(mcout
)));
49 this_thread::sleep_for(chrono::seconds(2));
52 strict_lock
<recursive_mutex
> lk(terminal_mutex
);
53 std::ostream
& gcout
= mcout
.get(lk
);
54 //std::istream & gcin = mcin.get(lk);
55 gcout
<< "Enter name: ";