|
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