Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r82306 - in branches/release: boost/thread boost/thread/detail boost/thread/pthread libs/thread/doc
From: vicente.botet_at_[hidden]
Date: 2013-01-01 04:41:04


Author: viboes
Date: 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
New Revision: 82306
URL: http://svn.boost.org/trac/boost/changeset/82306

Log:
Thread: merge from trunk 1.53
Text files modified:
   branches/release/boost/thread/detail/thread.hpp | 11 ++++-----
   branches/release/boost/thread/pthread/condition_variable.hpp | 14 ++++++-----
   branches/release/boost/thread/pthread/condition_variable_fwd.hpp | 14 ++++++-----
   branches/release/boost/thread/scoped_thread.hpp | 12 ++++++----
   branches/release/libs/thread/doc/changes.qbk | 18 ++++++++++-----
   branches/release/libs/thread/doc/condition_variables.qbk | 24 ++++----------------
   branches/release/libs/thread/doc/mutex_concepts.qbk | 25 +++++++++++++++++++--
   branches/release/libs/thread/doc/scoped_thread.qbk | 46 +++++++++++++++------------------------
   branches/release/libs/thread/doc/shared_mutex_ref.qbk | 2
   branches/release/libs/thread/doc/thread_ref.qbk | 9 ++++++-
   10 files changed, 93 insertions(+), 82 deletions(-)

Modified: branches/release/boost/thread/detail/thread.hpp
==============================================================================
--- branches/release/boost/thread/detail/thread.hpp (original)
+++ branches/release/boost/thread/detail/thread.hpp 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -743,9 +743,9 @@
     }
 #endif
     void thread::join() {
- BOOST_THREAD_ASSERT_PRECONDITION( this_thread::get_id() != get_id(),
- thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself")
- );
+ if (this_thread::get_id() == get_id())
+ boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself"));
+
         BOOST_THREAD_VERIFY_PRECONDITION( join_noexcept(),
             thread_resource_error(system::errc::invalid_argument, "boost thread: thread not joinable")
         );
@@ -757,9 +757,8 @@
     bool thread::do_try_join_until(uintmax_t timeout)
 #endif
     {
- BOOST_THREAD_ASSERT_PRECONDITION( this_thread::get_id() != get_id(),
- thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself")
- );
+ if (this_thread::get_id() == get_id())
+ boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself"));
         bool res;
         if (do_try_join_until_noexcept(timeout, res))
         {

Modified: branches/release/boost/thread/pthread/condition_variable.hpp
==============================================================================
--- branches/release/boost/thread/pthread/condition_variable.hpp (original)
+++ branches/release/boost/thread/pthread/condition_variable.hpp 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -307,12 +307,14 @@
                 const chrono::duration<Rep, Period>& d,
                 Predicate pred)
         {
- while (!pred())
- {
- if (wait_for(lock, d) == cv_status::timeout)
- return pred();
- }
- return true;
+ return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
+
+// while (!pred())
+// {
+// if (wait_for(lock, d) == cv_status::timeout)
+// return pred();
+// }
+// return true;
         }
 
         template <class lock_type>

Modified: branches/release/boost/thread/pthread/condition_variable_fwd.hpp
==============================================================================
--- branches/release/boost/thread/pthread/condition_variable_fwd.hpp (original)
+++ branches/release/boost/thread/pthread/condition_variable_fwd.hpp 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -221,12 +221,14 @@
                 const chrono::duration<Rep, Period>& d,
                 Predicate pred)
         {
- while (!pred())
- {
- if (wait_for(lock, d) == cv_status::timeout)
- return pred();
- }
- return true;
+ return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
+
+// while (!pred())
+// {
+// if (wait_for(lock, d) == cv_status::timeout)
+// return pred();
+// }
+// return true;
         }
 #endif
 

Modified: branches/release/boost/thread/scoped_thread.hpp
==============================================================================
--- branches/release/boost/thread/scoped_thread.hpp (original)
+++ branches/release/boost/thread/scoped_thread.hpp 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -49,13 +49,15 @@
      *
      * Effects: move the thread to own @c t.
      */
- explicit strict_scoped_thread(BOOST_THREAD_RV_REF(thread) t) :
+ explicit strict_scoped_thread(BOOST_THREAD_RV_REF(thread) t) BOOST_NOEXCEPT :
     t_(boost::move(t))
     {
     }
 
     /**
      * Destructor
+ * Effects: Call the CallableThread functor before destroying the owned thread.
+ * Remark: The CallableThread should not throw when joining the thread as the scoped variable is on a scope outside the thread function.
      */
     ~strict_scoped_thread()
     {
@@ -112,7 +114,7 @@
      *
      * Effects: move the thread to own @c t.
      */
- explicit scoped_thread(BOOST_THREAD_RV_REF(thread) t) :
+ explicit scoped_thread(BOOST_THREAD_RV_REF(thread) t) BOOST_NOEXCEPT :
     t_(boost::move(t))
     {
     }
@@ -125,14 +127,14 @@
     /**
      * Move constructor.
      */
- scoped_thread(BOOST_RV_REF(scoped_thread) x) :
+ scoped_thread(BOOST_RV_REF(scoped_thread) x) BOOST_NOEXCEPT :
     t_(boost::move(x.t_))
     {}
 
     /**
      * Destructor
      *
- * Effects: destroys the internal destroyer before destroying the owned thread.
+ * Effects: Call the CallableThread functor before destroying the owned thread.
      */
     ~scoped_thread()
     {
@@ -153,7 +155,7 @@
     /**
      *
      */
- void swap(scoped_thread& x)BOOST_NOEXCEPT
+ void swap(scoped_thread& x) BOOST_NOEXCEPT
     {
       t_.swap(x.t_);
     }

Modified: branches/release/libs/thread/doc/changes.qbk
==============================================================================
--- branches/release/libs/thread/doc/changes.qbk (original)
+++ branches/release/libs/thread/doc/changes.qbk 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -10,13 +10,13 @@
 
 [heading Version 4.0.0 - boost 1.53]
 
-Breaking changes:
+[*Breaking changes:]
 
 [warning
 BOOST_THREAD_VERSION==3 by default since Boost 1.53. So that all the deprecated features since 1.50 are not included by default. You can change this by setting the appropriated define (see Configuration section).
 ]
 
-Deprecated features:
+[*Deprecated features:]
 
 [warning Deprecated features since boost 1.53 will be available only until boost 1.58.]
 
@@ -25,12 +25,13 @@
 
 * [@http://svn.boost.org/trac/boost/ticket/7537 #7537] deprecate Mutex::scoped_lock and scoped_try_lock and boost::condition
 
-New Features:
+[*New Features:]
 
 * [@http://svn.boost.org/trac/boost/ticket/6270 #6270] c++11 compliance: Add thread constructor from movable callable and movable arguments
 Provided when BOOST_THREAD_PROVIDES_VARIADIC_THREAD is defined (Default value from Boost 1.55):
 See BOOST_THREAD_PROVIDES_VARIADIC_THREAD and BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD.
 
+* [@http://svn.boost.org/trac/boost/ticket/7279 #7279] C++11 compliance: Add noexcept in system related functions
 * [@http://svn.boost.org/trac/boost/ticket/7280 #7280] C++11 compliance: Add promise::...at_thread_exit functions
 
 * [@http://svn.boost.org/trac/boost/ticket/7281 #7281] C++11 compliance: Add ArgTypes to packaged_task template.
@@ -45,26 +46,29 @@
 
 * [@http://svn.boost.org/trac/boost/ticket/7413 #7413] C++11 compliance: Add async when the launch policy is deferred.
 * [@http://svn.boost.org/trac/boost/ticket/7414 #7414] C++11 compliance: future::get post-condition should be valid()==false.
+* [@http://svn.boost.org/trac/boost/ticket/7422 #7422] Provide a condition variable with zero-overhead performance penality.
 * [@http://svn.boost.org/trac/boost/ticket/7414 #7444] Async: Add make_future/make_shared_future.
-* [@http://svn.boost.org/trac/boost/ticket/7449 #7449] Synchro: Add a synchronized value class.
 * [@http://svn.boost.org/trac/boost/ticket/7540 #7540] Threads: Add a helper class that join a thread on destruction.
 * [@http://svn.boost.org/trac/boost/ticket/7541 #7541] Threads: Add a thread wrapper class that joins on destruction.
 * [@http://svn.boost.org/trac/boost/ticket/7575 #7575] C++11 compliance: A future created by async should "join" in the destructor.
 * [@http://svn.boost.org/trac/boost/ticket/7587 #7587] Synchro: Add strict_lock and nested_strict_lock.
 * [@http://svn.boost.org/trac/boost/ticket/7588 #7588] Synchro: Split the locks.hpp in several files to limit dependencies.
-* [@http://svn.boost.org/trac/boost/ticket/7589 #7589] Synchro: Add polymorphic lockables.
 * [@http://svn.boost.org/trac/boost/ticket/7590 #7590] Synchro: Add lockable concept checkers based on Boost.ConceptCheck.
 * [@http://svn.boost.org/trac/boost/ticket/7591 #7591] Add lockable traits that can be used with enable_if.
 * [@http://svn.boost.org/trac/boost/ticket/7592 #7592] Synchro: Add a null_mutex that is a no-op and that is a model of UpgardeLockable.
 * [@http://svn.boost.org/trac/boost/ticket/7593 #7593] Synchro: Add a externally_locked class.
 * [@http://svn.boost.org/trac/boost/ticket/7590 #7594] Threads: Allow to disable thread interruptions.
 
-Fixed Bugs:
+[*Fixed Bugs:]
 
 * [@http://svn.boost.org/trac/boost/ticket/7657 #7657] Serious performance and memory consumption hit if condition_variable methods condition notify_one or notify_all is used repeatedly.
+* [@http://svn.boost.org/trac/boost/ticket/7665 #7665] this_thread::sleep_for no longer uses steady_clock in thread.
 * [@http://svn.boost.org/trac/boost/ticket/7668 #7668] thread_group::join_all() should check whether its threads are joinable.
 * [@http://svn.boost.org/trac/boost/ticket/7669 #7669] thread_group::join_all() should catch resource_deadlock_would_occur.
 * [@http://svn.boost.org/trac/boost/ticket/7672 #7672] lockable_traits.hpp syntax error: "defined" token misspelled.
+* [@http://svn.boost.org/trac/boost/ticket/7798 #7798] boost::future set_wait_callback thread safety issues.
+* [@http://svn.boost.org/trac/boost/ticket/7808 #7808] Incorrect description of effects for this_thread::sleep_for and this_thread::sleep_until.
+* [@http://svn.boost.org/trac/boost/ticket/7812 #7812] Returns: cv_status::no_timeout if the call is returning because the time period specified by rel_time has elapsed, cv_status::timeout otherwise.
 
 
 [heading Version 3.1.0 - boost 1.52]
@@ -340,6 +344,8 @@
 
 # Add some of the extension proposed in [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3428.pdf A Standardized Representation of Asynchronous Operations], in particular
 
+ * [@http://svn.boost.org/trac/boost/ticket/7589 #7589] Synchro: Add polymorphic lockables.
+ * [@http://svn.boost.org/trac/boost/ticket/7449 #7449] Synchro: Add a synchronized value class.
   * [@http://svn.boost.org/trac/boost/ticket/7445 #7445] Async: Add future<>.then.
   * [@http://svn.boost.org/trac/boost/ticket/7446 #7446] Async: Add when_any.
   * [@http://svn.boost.org/trac/boost/ticket/7447 #7447] Async: Add when_all.

Modified: branches/release/libs/thread/doc/condition_variables.qbk
==============================================================================
--- branches/release/libs/thread/doc/condition_variables.qbk (original)
+++ branches/release/libs/thread/doc/condition_variables.qbk 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -131,7 +131,7 @@
                 const chrono::duration<Rep, Period>& d,
                 Predicate pred);
 
- #if defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0 || defined BOOST_THREAD_DONT_USE_CHRONO
+ #if defined BOOST_THREAD_USES_DATETIME
             bool timed_wait(boost::unique_lock<boost::mutex>& lock,boost::system_time const& abs_time);
             template<typename duration_type>
             bool timed_wait(boost::unique_lock<boost::mutex>& lock,duration_type const& rel_time);
@@ -419,14 +419,7 @@
 [variablelist
 
 [[Effects:] [As-if ``
-while(!pred())
-{
- if(!wait_for(lock,rel_time))
- {
- return pred();
- }
-}
-return true;
+return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
 ``]]
 
 ]
@@ -482,7 +475,7 @@
                 const chrono::duration<Rep, Period>& d,
                 Predicate pred);
 
- #if defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0 || defined BOOST_THREAD_DONT_USE_CHRONO
+ #if defined BOOST_THREAD_USES_DATETIME
             template<typename lock_type>
             bool timed_wait(lock_type& lock,boost::system_time const& abs_time);
             template<typename lock_type,typename duration_type>
@@ -731,19 +724,12 @@
 
 [endsect]
 
-[section:wait_for_predicate `template <class lock_type, class Rep, class Period, class Predicate> bool wait_until(lock_type& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred)`]
+[section:wait_for_predicate `template <class lock_type, class Rep, class Period, class Predicate> bool wait_for(lock_type& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred)`]
 
 [variablelist
 
 [[Effects:] [As-if ``
-while(!pred())
-{
- if(!__cvany_wait_for(lock,rel_time))
- {
- return pred();
- }
-}
-return true;
+return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
 ``]]
 
 ]

Modified: branches/release/libs/thread/doc/mutex_concepts.qbk
==============================================================================
--- branches/release/libs/thread/doc/mutex_concepts.qbk (original)
+++ branches/release/libs/thread/doc/mutex_concepts.qbk 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -44,6 +44,8 @@
 
 [[Effects:] [The current thread blocks until ownership can be obtained for the current thread.]]
 
+[[Synchronization:] [Prior `unlock()` operations on the same object synchronizes with this operation. ]]
+
 [[Postcondition:] [The current thread owns `m`.]]
 
 [[Return type:] [`void`.]]
@@ -71,6 +73,8 @@
 
 [[Requires:] [The current thread owns `m`.]]
 
+[[Synchronization:] [This operation synchronizes with subsequent lock operations that obtain ownership on the same object.]]
+
 [[Effects:] [Releases a lock on `m` by the current thread.]]
 
 [[Return type:] [`void`.]]
@@ -119,6 +123,12 @@
 
 [[Effects:] [Attempt to obtain ownership for the current thread without blocking.]]
 
+[[Synchronization:] [If `try_lock()` returns true, prior `unlock()` operations on the same object synchronize with this operation.]]
+
+[[Note:] [Since `lock()` does not synchronize with a failed subsequent
+`try_lock()`, the visibility rules are weak enough that little would be known about the state after a
+failure, even in the absence of spurious failures.]]
+
 [[Return type:] [`bool`.]]
 
 [[Returns:] [`true` if ownership was obtained for the current thread, `false` otherwise.]]
@@ -213,6 +223,10 @@
 [[Effects:] [Attempt to obtain ownership for the current thread. Blocks until ownership can be obtained, or the specified time is
 reached. If the specified time has already passed, behaves as __try_lock_ref__.]]
 
+[[Synchronization:] [If `try_lock_until()` returns true, prior `unlock()` operations on the same object synchronize with this operation.]]
+
+[[Return type:] [`bool`.]]
+
 [[Returns:] [`true` if ownership was obtained for the current thread, `false` otherwise.]]
 
 [[Postcondition:] [If the call returns `true`, the current thread owns `m`.]]
@@ -227,13 +241,15 @@
 
 [[Effects:] [As-if `__try_lock_until(chrono::steady_clock::now() + rel_time)`.]]
 
+[[Synchronization:] [If `try_lock_for()` returns true, prior `unlock()` operations on the same object synchronize with this operation.]]
+
 ]
 [endsect]
 
 [warning
-DEPRECATED since 3.00. The following expressions were required on version 2, but are now deprecated.
+DEPRECATED since 4.00. The following expressions were required on version 2, but are now deprecated.
  
-Available only up to Boost 1.56.
+Available only up to Boost 1.58.
 
 Use instead __try_lock_for, __try_lock_until.
 ]
@@ -2415,6 +2431,7 @@
 
 An instance of __reverse_lock doesn't ['own] the lock never.
 
+
 [section:constructor `reverse_lock(Lock & m)`]
 
 [variablelist
@@ -2436,7 +2453,9 @@
 
 [[Effects:] [Let be mtx the stored mutex*. If not 0 Invokes `mtx->__lock()` and gives again the `mtx` to the `Lock` using the `adopt_lock_t` overload.]]
 
-[[Throws:] [Nothing.]]
+[[Throws:] [Any exception thrown by `mtx->__lock()`.]]
+
+[[Remarks:] [Note that if `mtx->__lock()` throws an exception while unwinding the program will terminate, so don't use reverse_lock if an exception can be thrown.]]
 
 ]
 

Modified: branches/release/libs/thread/doc/scoped_thread.qbk
==============================================================================
--- branches/release/libs/thread/doc/scoped_thread.qbk (original)
+++ branches/release/libs/thread/doc/scoped_thread.qbk 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -111,14 +111,14 @@
   };
 
 
-RAI @c thread wrapper adding a specific destroyer allowing to master what can be done at destruction time.
+RAI __thread wrapper adding a specific destroyer allowing to master what can be done at destruction time.
 
-CallableThread: A callable void(thread&) .
+CallableThread: A callable `void(thread&)`.
 
-The default is a join_if_joinable.
+The default is a `join_if_joinable`.
 
 
-thread std/boost::thread destructor terminates the program if the thread is not joinable.
+`std/boost::thread` destructor terminates the program if the __thread is not joinable.
 This wrapper can be used to join the thread before destroying it seems a natural need.
 
 [heading Example]
@@ -131,7 +131,7 @@
 
 [variablelist
 
-[[Effects:] [move the thread to own @c t]]
+[[Effects:] [move the thread to own `t_`]]
 
 [[Throws:] [Nothing]]
 
@@ -147,7 +147,8 @@
 
 [[Effects:] [Equivalent to `CallableThread()(t_)`. ]]
 
-[[Throws:] [Nothing]]
+[[Throws:] [Nothing: The `CallableThread()(t_)` should not throw when joining the thread as the scoped variable is on a scope outside the thread function.]]
+
 
 ]
 
@@ -161,12 +162,13 @@
 
     class scoped_thread
     {
+ thread t_; // for exposition purposes only
     public:
         scoped_thread() noexcept;
         scoped_thread(const scoped_thread&) = delete;
         scoped_thread& operator=(const scoped_thread&) = delete;
 
- explicit scoped_thread(thread&& th);
+ explicit scoped_thread(thread&& th) noexcept;
 
         ~scoped_thread();
 
@@ -182,10 +184,12 @@
 
         bool joinable() const noexcept;
         void join();
+ #ifdef BOOST_THREAD_USES_CHRONO
         template <class Rep, class Period>
         bool try_join_for(const chrono::duration<Rep, Period>& rel_time);
         template <class Clock, class Duration>
         bool try_join_until(const chrono::time_point<Clock, Duration>& t);
+ #endif
 
         void detach();
 
@@ -194,23 +198,11 @@
         typedef thread::native_handle_type native_handle_type;
         native_handle_type native_handle();
 
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
         void interrupt();
         bool interruption_requested() const noexcept;
-
-
- #if defined BOOST_THREAD_USES_DATETIME
- bool timed_join(const system_time& wait_until); // DEPRECATED
- template<typename TimeDuration>
- bool timed_join(TimeDuration const& rel_time); // DEPRECATED
- static void sleep(const system_time& xt);// DEPRECATED
     #endif
 
- #if defined BOOST_THREAD_PROVIDES_THREAD_EQ
- bool operator==(const scoped_thread& other) const; // DEPRECATED
- bool operator!=(const scoped_thread& other) const; // DEPRECATED
-
- #endif
- static void yield() noexcept; // DEPRECATED
 
     };
 
@@ -225,9 +217,9 @@
 thread std::thread destructor terminates the program if the thread is not joinable.
 Having a wrapper that can join the thread before destroying it seems a natural need.
 
-Remark: scoped_thread is not a @c thread as @c thread is not designed to be derived from as a polymorphic type.
+Remark: `scoped_thread` is not a __thread as __thread is not designed to be derived from as a polymorphic type.
 
-Anyway scoped_thread can be used in most of the contexts a @c thread could be used as it has the
+Anyway `scoped_thread` can be used in most of the contexts a __thread could be used as it has the
 same non-deprecated interface with the exception of the construction.
 
 [heading Example]
@@ -277,9 +269,9 @@
 [[Effects:] [Transfers ownership of the scoped_thread managed by `other` (if
 any) to `*this`.
 
-_ if defined BOOST_THREAD_DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE: If there was a scoped_thread previously associated with `*this` then that scoped_thread is detached, DEPRECATED
+- if defined `BOOST_THREAD_DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE`: If there was a `scoped_thread` previously associated with `*this` then that `scoped_thread` is detached, DEPRECATED
 
-- if defined BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE: If the scoped_thread is joinable calls to std::terminate.
+- if defined `BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE`: If the `scoped_thread` is joinable calls to std::terminate.
 ]]
 
 [[Postconditions:] [`other->get_id()==thread::id()` and `get_id()` returns the value of `other.get_id()` prior to the assignment.]]
@@ -296,7 +288,7 @@
 
 [variablelist
 
-[[Effects:] [move the thread to own @c t.]]
+[[Effects:] [move the thread to own `t_`.]]
 
 [[Postconditions:] [`*this.t_` refers to the newly created thread of execution and `this->get_id()!=thread::id()`.]]
 
@@ -315,7 +307,7 @@
 
 [[Effects:] [Equivalent to `CallableThread()(t_)`. ]]
 
-[[Throws:] [Nothing]]
+[[Throws:] [Nothing: The `CallableThread()(t_)` should not throw when joining the thread as the scoped variable is on a scope outside the thread function.]]
 
 ]
 
@@ -345,8 +337,6 @@
 
 [[Effects:] [Equivalent to t_.join().]]
 
-]]
-
 ]
 
 [endsect]

Modified: branches/release/libs/thread/doc/shared_mutex_ref.qbk
==============================================================================
--- branches/release/libs/thread/doc/shared_mutex_ref.qbk (original)
+++ branches/release/libs/thread/doc/shared_mutex_ref.qbk 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -45,7 +45,7 @@
         void unlock_upgrade_and_lock_shared();
     #endif
 
- #if defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0 || defined BOOST_THREAD_DONT_USE_CHRONO
+ #if defined BOOST_THREAD_USES_DATETIME
         bool timed_lock_shared(system_time const& timeout);
         bool timed_lock(system_time const& timeout);
     #endif

Modified: branches/release/libs/thread/doc/thread_ref.qbk
==============================================================================
--- branches/release/libs/thread/doc/thread_ref.qbk (original)
+++ branches/release/libs/thread/doc/thread_ref.qbk 2013-01-01 04:41:02 EST (Tue, 01 Jan 2013)
@@ -547,7 +547,7 @@
 [[Effects:] [Transfers ownership of the thread managed by `other` (if
 any) to `*this`.
 
-_ if defined BOOST_THREAD_DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE: If there was a thread previously associated with `*this` then that thread is detached, DEPRECATED
+- if defined BOOST_THREAD_DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE: If there was a thread previously associated with `*this` then that thread is detached, DEPRECATED
 
 - if defined BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE: If the thread is joinable calls to std::terminate.
 ]]
@@ -755,13 +755,18 @@
 
 [[Effects:] [If `*this` refers to a thread of execution, waits for that thread of execution to complete.]]
 
+[[Synchronization:] [The completion of the thread represented by `*this` synchronizes with the
+corresponding successful `join()` return. ]]
+[[Note:] [Operations on *this are not synchronized.
+ ]]
+
 [[Postconditions:] [If `*this` refers to a thread of execution on entry, that thread of execution has completed. `*this` no longer refers to any thread of execution.]]
 
 [[Throws:] [__thread_interrupted__ if the current thread of execution is interrupted or `system_error`]]
 
 [[Error Conditions:] [
 
-[*resource_deadlock_would_occur]: if deadlock is detected or `this->get_id() == boost::this_thread::get_id()` and `BOOST_THREAD_TRHOW_IF_PRECONDITION_NOT_SATISFIED` is defined..
+[*resource_deadlock_would_occur]: if deadlock is detected or `this->get_id() == boost::this_thread::get_id()`.
 
 [*invalid_argument]: if the thread is not joinable and `BOOST_THREAD_TRHOW_IF_PRECONDITION_NOT_SATISFIED` is defined.
 


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