|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r82318 - in trunk: boost/thread libs/thread/example
From: vicente.botet_at_[hidden]
Date: 2013-01-02 09:14:03
Author: viboes
Date: 2013-01-02 09:14:03 EST (Wed, 02 Jan 2013)
New Revision: 82318
URL: http://svn.boost.org/trac/boost/changeset/82318
Log:
Thread: complete externally_locked_stream.
Text files modified:
trunk/boost/thread/externally_locked_stream.hpp | 103 ++++++++++++++++++++++-----------------
trunk/libs/thread/example/not_interleaved.cpp | 33 +++++++++---
2 files changed, 82 insertions(+), 54 deletions(-)
Modified: trunk/boost/thread/externally_locked_stream.hpp
==============================================================================
--- trunk/boost/thread/externally_locked_stream.hpp (original)
+++ trunk/boost/thread/externally_locked_stream.hpp 2013-01-02 09:14:03 EST (Wed, 02 Jan 2013)
@@ -4,12 +4,15 @@
// http://www.boost.org/LICENSE_1_0.txt)
-#ifndef BOOST_THREAD_EXTERNALLY_LOCKED_HPP
-#define BOOST_THREAD_EXTERNALLY_LOCKED_HPP
+#ifndef BOOST_THREAD_EXTERNALLY_LOCKED_STREAM_HPP
+#define BOOST_THREAD_EXTERNALLY_LOCKED_STREAM_HPP
#include <boost/thread/detail/config.hpp>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/detail/delete.hpp>
#include <boost/thread/externally_locked.hpp>
+#include <boost/thread/lock_traits.hpp>
#include <boost/thread/recursive_mutex.hpp>
#include <boost/config/abi_prefix.hpp>
@@ -17,11 +20,11 @@
namespace boost
{
- static recursive_mutex& terminal_mutex()
- {
- static recursive-mutex mtx;
- return mtx;
- }
+ // inline static recursive_mutex& terminal_mutex()
+ // {
+ // static recursive_mutex mtx;
+ // return mtx;
+ // }
template <typename Stream>
class externally_locked_stream;
@@ -29,36 +32,47 @@
template <class Stream>
class stream_guard
{
- stream_guard(externally_locked_stream<Stream>& mtx, adopt_lock_t)
- : mtx_(mtx)
+ stream_guard(externally_locked_stream<Stream>& mtx, adopt_lock_t) :
+ mtx_(mtx)
{
}
- Stream& get() const
- {
- mtx_.get(*this);
- }
- friend class externally_locked_stream<Stream>;
+ friend class externally_locked_stream<Stream> ;
public:
typedef typename externally_locked_stream<Stream>::mutex_type mutex_type;
- BOOST_THREAD_NO_COPYABLE( externally_locked_stream )
+ BOOST_THREAD_MOVABLE_ONLY( stream_guard)
- stream_guard(externally_locked_stream<Stream>& mtx)
- : mtx_(mtx)
+ stream_guard(externally_locked_stream<Stream>& mtx) :
+ mtx_(&mtx)
{
mtx.lock();
}
+ stream_guard(BOOST_THREAD_RV_REF(stream_guard) rhs)
+ : mtx_(rhs.mtx_)
+ {
+ rhs.mtx_= 0;
+ }
+
~stream_guard()
{
- mtx_.unlock();
+ if (mtx_ != 0) mtx_->unlock();
}
+ bool owns_lock(mutex_type const* l) const BOOST_NOEXCEPT
+ {
+ return l == mtx_->mutex();
+ }
+
+ Stream& get() const
+ {
+ return mtx_->get(*this);
+ }
private:
- externally_locked_stream<Stream>& mtx_;
+ externally_locked_stream<Stream>* mtx_;
};
template <typename Stream>
@@ -78,6 +92,8 @@
{
typedef externally_locked<Stream&, recursive_mutex> base_type;
public:
+ BOOST_THREAD_NO_COPYABLE( externally_locked_stream)
+
/**
* Effects: Constructs an externally locked object storing the cloaked reference object.
*/
@@ -86,60 +102,57 @@
{
}
-
stream_guard<Stream> hold()
{
- return stream_guard<Stream>(*this);
+ return stream_guard<Stream> (*this);
}
};
-//]
+ //]
template <typename Stream, typename T>
- const stream_guard<Stream>& operator<<(const stream_guard<Stream>& lck, T arg)
+ inline const stream_guard<Stream>& operator<<(const stream_guard<Stream>& lck, T arg)
{
- lck.get() << arg;
- return lck;
+ lck.get() << arg;
+ return lck;
}
template <typename Stream>
- const stream_guard<Stream>& operator<<(const stream_guard<Stream>& lck,
- Stream& (*arg)(Stream&))
+ inline const stream_guard<Stream>& operator<<(const stream_guard<Stream>& lck, Stream& (*arg)(Stream&))
{
- lck.get() << arg;
- return lck;
+ lck.get() << arg;
+ return lck;
}
template <typename Stream, typename T>
- const stream_guard<Stream>& operator>>(const stream_guard<Stream>& lck, T& arg)
+ inline const stream_guard<Stream>& operator>>(const stream_guard<Stream>& lck, T& arg)
{
- lck.get() >> arg;
- return lck;
+ lck.get() >> arg;
+ return lck;
}
template <typename Stream, typename T>
- stream_guard<Stream> operator<<(externally_locked_stream<Stream>& mtx, T arg)
+ inline stream_guard<Stream> operator<<(externally_locked_stream<Stream>& mtx, T arg)
{
- mtx.lock();
- mtx.get() << arg;
- return stream_guard<Stream>(mtx, adopt_lock);
+ stream_guard<Stream> lk(mtx);
+ mtx.get(lk) << arg;
+ return boost::move(lk);
}
template <typename Stream>
- stream_guard<Stream> operator<<(externally_locked_stream<Stream>& mtx,
- Stream& (*arg)(Stream&))
+ inline stream_guard<Stream> operator<<(externally_locked_stream<Stream>& mtx, Stream& (*arg)(Stream&))
{
- mtx.lock();
- mtx.get() << arg;
- return stream_guard<Stream>(mtx, adopt_lock);
+ stream_guard<Stream> lk(mtx);
+ mtx.get(lk) << arg;
+ return boost::move(lk);
}
template <typename Stream, typename T>
- stream_guard<Stream> operator>>(externally_locked_stream<Stream>& mtx, T& arg)
+ inline stream_guard<Stream> operator>>(externally_locked_stream<Stream>& mtx, T& arg)
{
- mtx.lock();
- mtx.get() >> arg;
- return stream_guard<Stream>(mtx, adopt_lock);
+ stream_guard<Stream> lk(mtx);
+ mtx.get(lk) >> arg;
+ return boost::move(lk);
}
}
Modified: trunk/libs/thread/example/not_interleaved.cpp
==============================================================================
--- trunk/libs/thread/example/not_interleaved.cpp (original)
+++ trunk/libs/thread/example/not_interleaved.cpp 2013-01-02 09:14:03 EST (Wed, 02 Jan 2013)
@@ -6,9 +6,10 @@
// adapted from the example given by Howard Hinnant in
+#define BOOST_THREAD_VERSION 4
#include <iostream>
-#include <boost/thread/thread.hpp>
+#include <boost/thread/scoped_thread.hpp>
#include <boost/thread/externally_locked_stream.hpp>
void use_cerr(boost::externally_locked_stream<std::ostream> &mcerr)
@@ -18,7 +19,18 @@
while (chrono::steady_clock::now() < tf)
{
mcerr << "logging data to cerr\n";
- this_thread::sleep_for(milliseconds(500));
+ this_thread::sleep_for(chrono::milliseconds(500));
+ }
+}
+
+void use_cout(boost::externally_locked_stream<std::ostream> &mcout)
+{
+ using namespace boost;
+ auto tf = chrono::steady_clock::now() + chrono::seconds(5);
+ while (chrono::steady_clock::now() < tf)
+ {
+ mcout << "logging data to cout\n";
+ this_thread::sleep_for(chrono::milliseconds(250));
}
}
@@ -26,17 +38,20 @@
{
using namespace boost;
- externally_locked_stream<std::ostream> mcerr(std::cerr, terminal_mutex());
- externally_locked_stream<std::ostream> mcout(std::cerr, terminal_mutex());
- externally_locked_stream<std::istream> mcin(std::cerr, terminal_mutex());
+ recursive_mutex terminal_mutex;
- thread t1(use_cerr, mcerr);
- this_thread::sleep_for(boost::chrono::seconds(2));
+ externally_locked_stream<std::ostream> mcerr(std::cerr, terminal_mutex);
+ externally_locked_stream<std::ostream> mcout(std::cout, terminal_mutex);
+ externally_locked_stream<std::istream> mcin(std::cin, terminal_mutex);
+
+ scoped_thread<> t1(thread(use_cerr, boost::ref(mcerr)));
+ scoped_thread<> t2(thread(use_cout, boost::ref(mcout)));
+ this_thread::sleep_for(chrono::seconds(2));
std::string nm;
mcout << "Enter name: ";
- mcin >> nm;
+ //mcin >> nm;
t1.join();
mcout << nm << '\n';
- return 0;
+ return 1;
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk