diff options
Diffstat (limited to 'doc/html/thread/thread_management.html')
-rw-r--r--[-rwxr-xr-x] | doc/html/thread/thread_management.html | 1451 |
1 files changed, 1104 insertions, 347 deletions
diff --git a/doc/html/thread/thread_management.html b/doc/html/thread/thread_management.html index 1e5962f5a2..3ba8a8088e 100755..100644 --- a/doc/html/thread/thread_management.html +++ b/doc/html/thread/thread_management.html @@ -5,7 +5,7 @@ <link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> <meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> <link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> -<link rel="up" href="../thread.html" title="Chapter 28. Thread"> +<link rel="up" href="../thread.html" title="Chapter 28. Thread 3.0.1"> <link rel="prev" href="future.html" title="Future"> <link rel="next" href="synchronization.html" title="Synchronization"> </head> @@ -27,28 +27,84 @@ <a name="thread.thread_management"></a><a class="link" href="thread_management.html" title="Thread Management">Thread Management</a> </h2></div></div></div> <div class="toc"><dl> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.synopsis">Synopsis</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial">Tutorial</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread">Class <code class="computeroutput"><span class="identifier">thread</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread">Namespace <code class="computeroutput"><span class="identifier">this_thread</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.threadgroup">Class <code class="computeroutput"><span class="identifier">thread_group</span></code></a></span></dt> </dl></div> -<h4> -<a name="thread.thread_management.h0"></a> - <span><a name="thread.thread_management.synopsis"></a></span><a class="link" href="thread_management.html#thread.thread_management.synopsis">Synopsis</a> - </h4> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="thread.thread_management.synopsis"></a><a class="link" href="thread_management.html#thread.thread_management.synopsis" title="Synopsis">Synopsis</a> +</h3></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> + +<span class="keyword">namespace</span> <span class="identifier">boost</span> +<span class="special">{</span> + <span class="keyword">class</span> <span class="identifier">thread</span><span class="special">;</span> + <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> + + <span class="keyword">namespace</span> <span class="identifier">this_thread</span> + <span class="special">{</span> + <span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">yield</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">sleep_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">sleep_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span> + + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">at_thread_exit</span><span class="special">(</span><span class="identifier">Callable</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span> + + <span class="keyword">void</span> <span class="identifier">interruption_point</span><span class="special">();</span> <span class="comment">// EXTENSION</span> + <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + <span class="keyword">bool</span> <span class="identifier">interruption_enabled</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION </span> + <span class="keyword">class</span> <span class="identifier">disable_interruption</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + <span class="keyword">class</span> <span class="identifier">restore_interruption</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + + <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span> + <span class="keyword">void</span> <span class="identifier">sleep</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span> + <span class="keyword">void</span> <span class="identifier">sleep</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span> + <span class="preprocessor">#endif</span> + <span class="special">}</span> + <span class="keyword">class</span> <span class="identifier">thread_group</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + +<span class="special">}</span> +</pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="thread.thread_management.tutorial"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial" title="Tutorial">Tutorial</a> +</h3></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial.launching">Launching + threads</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial.attributes">Thread + attributes</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial.exceptions">Exceptions + in thread functions</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial.join">Joining and + detaching</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial.interruption">Interruption</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial.id">Thread IDs</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial.native_in">Using + native interfaces with Boost.Thread resources</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.tutorial.native_from">Using + Boost.Thread interfaces in a native thread</a></span></dt> +</dl></div> <p> - The <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - class is responsible for launching and managing threads. Each <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object represents a single thread of execution, or <span class="emphasis"><em>Not-a-Thread</em></span>, - and at most one <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object represents a given thread of execution: objects of type <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - are not copyable. - </p> + The <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> + class is responsible for launching and managing threads. Each <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object represents a single + thread of execution, or <span class="emphasis"><em>Not-a-Thread</em></span>, and at most one + <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> + object represents a given thread of execution: objects of type <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> are not copyable. + </p> <p> - Objects of type <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - are movable, however, so they can be stored in move-aware containers, and returned - from functions. This allows the details of thread creation to be wrapped in - a function. - </p> + Objects of type <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> are movable, however, so + they can be stored in move-aware containers, and returned from functions. + This allows the details of thread creation to be wrapped in a function. + </p> <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">make_thread</span><span class="special">();</span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span> @@ -57,32 +113,40 @@ <span class="identifier">some_thread</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> <span class="special">}</span> </pre> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"> <p> - [Note: On compilers that support rvalue references, <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - provides a proper move constructor and move-assignment operator, and therefore - meets the C++0x <span class="emphasis"><em>MoveConstructible</em></span> and <span class="emphasis"><em>MoveAssignable</em></span> - concepts. With such compilers, <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - can therefore be used with containers that support those concepts. - </p> + On compilers that support rvalue references, <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> provides a proper move + constructor and move-assignment operator, and therefore meets the C++0x + <span class="emphasis"><em>MoveConstructible</em></span> and <span class="emphasis"><em>MoveAssignable</em></span> + concepts. With such compilers, <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> can therefore be used with + containers that support those concepts. + </p> <p> - For other compilers, move support is provided with a move emulation layer, - so containers must explicitly detect that move emulation layer. See <boost/thread/detail/move.hpp> - for details.] - </p> -<h4> -<a name="thread.thread_management.h1"></a> - <span><a name="thread.thread_management.launching_threads"></a></span><a class="link" href="thread_management.html#thread.thread_management.launching_threads">Launching - threads</a> - </h4> + For other compilers, move support is provided with a move emulation layer, + so containers must explicitly detect that move emulation layer. See <boost/thread/detail/move.hpp> + for details. + </p> +</td></tr> +</table></div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.tutorial.launching"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial.launching" title="Launching threads">Launching + threads</a> +</h4></div></div></div> <p> - A new thread is launched by passing an object of a callable type that can be - invoked with no parameters to the constructor. The object is then copied into - internal storage, and invoked on the newly-created thread of execution. If - the object must not (or cannot) be copied, then <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code> can - be used to pass in a reference to the function object. In this case, the user - of <span class="bold"><strong>Boost.Thread</strong></span> must ensure that the referred-to - object outlives the newly-created thread of execution. - </p> + A new thread is launched by passing an object of a callable type that can + be invoked with no parameters to the constructor. The object is then copied + into internal storage, and invoked on the newly-created thread of execution. + If the object must not (or cannot) be copied, then <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code> + can be used to pass in a reference to the function object. In this case, + the user of <span class="bold"><strong>Boost.Thread</strong></span> must ensure that + the referred-to object outlives the newly-created thread of execution. + </p> <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">callable</span> <span class="special">{</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()();</span> @@ -102,88 +166,165 @@ <span class="comment">// this leads to undefined behaviour</span> </pre> <p> - If you wish to construct an instance of <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - with a function or callable object that requires arguments to be supplied, - this can be done by passing additional arguments to the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - constructor: - </p> + If you wish to construct an instance of <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> with a function or callable + object that requires arguments to be supplied, this can be done by passing + additional arguments to the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> constructor: + </p> <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">find_the_question</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">the_answer</span><span class="special">);</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">deep_thought_2</span><span class="special">(</span><span class="identifier">find_the_question</span><span class="special">,</span><span class="number">42</span><span class="special">);</span> </pre> <p> - The arguments are <span class="emphasis"><em>copied</em></span> into the internal thread structure: - if a reference is required, use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code>, just - as for references to callable functions. - </p> + The arguments are <span class="emphasis"><em>copied</em></span> into the internal thread + structure: if a reference is required, use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code>, + just as for references to callable functions. + </p> +<p> + There is an unspecified limit on the number of additional arguments that + can be passed. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.tutorial.attributes"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial.attributes" title="Thread attributes">Thread + attributes</a> +</h4></div></div></div> +<p> + Thread launched in this way are created with implementation defined thread + attributes as stack size, scheduling, priority, ... or any platform specific + attributes. It is not evident how to provide a portable interface that + allows the user to set the platform specific attributes. Boost.Thread stay + in the middle road through the class thread::attributes which allows to + set at least in a portable way the stack size as follows: + </p> +<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">attributes</span> <span class="identifier">attrs</span><span class="special">;</span> +<span class="identifier">attrs</span><span class="special">.</span><span class="identifier">set_size</span><span class="special">(</span><span class="number">4096</span><span class="special">*</span><span class="number">10</span><span class="special">);</span> +<span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">deep_thought_2</span><span class="special">(</span><span class="identifier">attrs</span><span class="special">,</span> <span class="identifier">find_the_question</span><span class="special">,</span> <span class="number">42</span><span class="special">);</span> +</pre> +<p> + Even for this simple attribute there could be portable issues as some platforms + could require that the stack size should have a minimal size and/or be + a multiple of a given page size. The library adapts the requested size + to the platform constraints so that the user doesn't need to take care + of it. + </p> +<p> + This is the single attribute that is provided in a portable way. In order + to set any other thread attribute at construction time the user needs to + use non portable code. + </p> <p> - There is an unspecified limit on the number of additional arguments that can - be passed. - </p> -<h4> -<a name="thread.thread_management.h2"></a> - <span><a name="thread.thread_management.exceptions_in_thread_functions"></a></span><a class="link" href="thread_management.html#thread.thread_management.exceptions_in_thread_functions">Exceptions - in thread functions</a> - </h4> + On PThread platforms the user will need to get the thread attributes handle + and use it for whatever attribute. + </p> <p> - If the function or callable object passed to the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - constructor propagates an exception when invoked that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>, - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> - is called. - </p> -<h4> -<a name="thread.thread_management.h3"></a> - <span><a name="thread.thread_management.joining_and_detaching"></a></span><a class="link" href="thread_management.html#thread.thread_management.joining_and_detaching">Joining - and detaching</a> - </h4> + Next follows how the user could set the stack size and the scheduling policy + on PThread platforms. + </p> +<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">attributes</span> <span class="identifier">attrs</span><span class="special">;</span> +<span class="comment">// set portable attributes</span> +<span class="comment">// ...</span> +<span class="identifier">attr</span><span class="special">.</span><span class="identifier">set_stack_size</span><span class="special">(</span><span class="number">4096</span><span class="special">*</span><span class="number">10</span><span class="special">);</span> +<span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PLATFORM_WIN32</span><span class="special">)</span> + <span class="comment">// ... window version</span> +<span class="preprocessor">#elif</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PLATFORM_PTHREAD</span><span class="special">)</span> + <span class="comment">// ... pthread version</span> + <span class="identifier">pthread_attr_setschedpolicy</span><span class="special">(</span><span class="identifier">attr</span><span class="special">.</span><span class="identifier">get_native_handle</span><span class="special">(),</span> <span class="identifier">SCHED_RR</span><span class="special">);</span> +<span class="preprocessor">#else</span> +<span class="preprocessor">#error</span> <span class="string">"Boost threads unavailable on this platform"</span> +<span class="preprocessor">#endif</span> +<span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">(</span><span class="identifier">attrs</span><span class="special">,</span> <span class="identifier">find_the_question</span><span class="special">,</span> <span class="number">42</span><span class="special">);</span> +</pre> <p> - When the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object that represents a thread of execution is destroyed the thread becomes - <span class="emphasis"><em>detached</em></span>. Once a thread is detached, it will continue - executing until the invocation of the function or callable object supplied - on construction has completed, or the program is terminated. A thread can also - be detached by explicitly invoking the <a class="link" href="thread_management.html#thread.thread_management.thread.detach" title="Member function detach()"><code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code></a> - member function on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object. In this case, the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object ceases to represent the now-detached thread, and instead represents - <span class="emphasis"><em>Not-a-Thread</em></span>. - </p> + On Windows platforms it is not so simple as there is no type that compiles + the thread attributes. There is a linked to the creation of a thread on + Windows that is emulated via the thread::attributes class. This is the + LPSECURITY_ATTRIBUTES lpThreadAttributes. Boost.Thread provides a non portable + set_security function so that the user can provide it before the thread + creation as follows + </p> +<pre class="programlisting"><span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PLATFORM_WIN32</span><span class="special">)</span> + <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">attributes</span> <span class="identifier">attrs</span><span class="special">;</span> + <span class="comment">// set portable attributes</span> + <span class="identifier">attr</span><span class="special">.</span><span class="identifier">set_stack_size</span><span class="special">(</span><span class="number">4096</span><span class="special">*</span><span class="number">10</span><span class="special">);</span> + <span class="comment">// set non portable attribute</span> + <span class="identifier">LPSECURITY_ATTRIBUTES</span> <span class="identifier">sec</span><span class="special">;</span> + <span class="comment">// init sec </span> + <span class="identifier">attr</span><span class="special">.</span><span class="identifier">set_security</span><span class="special">(</span><span class="identifier">sec</span><span class="special">);</span> + <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">th</span><span class="special">(</span><span class="identifier">attrs</span><span class="special">,</span> <span class="identifier">find_the_question</span><span class="special">,</span> <span class="number">42</span><span class="special">);</span> + <span class="comment">// Set other thread attributes using the native_handle_type.</span> + <span class="comment">//...</span> +<span class="preprocessor">#else</span> +<span class="preprocessor">#error</span> <span class="string">"Platform not supported"</span> +<span class="preprocessor">#endif</span> +</pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.tutorial.exceptions"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial.exceptions" title="Exceptions in thread functions">Exceptions + in thread functions</a> +</h4></div></div></div> <p> - In order to wait for a thread of execution to finish, the <a class="link" href="thread_management.html#thread.thread_management.thread.join" title="Member function join()"><code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a> - or <a class="link" href="thread_management.html#thread.thread_management.thread.timed_join" title="Member function timed_join()"><code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code></a> - member functions of the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object must be used. <a class="link" href="thread_management.html#thread.thread_management.thread.join" title="Member function join()"><code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a> - will block the calling thread until the thread represented by the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object has completed. If the thread of execution represented by the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object has already completed, or the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object represents <span class="emphasis"><em>Not-a-Thread</em></span>, then <a class="link" href="thread_management.html#thread.thread_management.thread.join" title="Member function join()"><code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a> - returns immediately. <a class="link" href="thread_management.html#thread.thread_management.thread.timed_join" title="Member function timed_join()"><code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code></a> - is similar, except that a call to <a class="link" href="thread_management.html#thread.thread_management.thread.timed_join" title="Member function timed_join()"><code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code></a> - will also return if the thread being waited for does not complete when the - specified time has elapsed. - </p> -<h4> -<a name="thread.thread_management.h4"></a> - <span><a name="thread.thread_management.interruption"></a></span><a class="link" href="thread_management.html#thread.thread_management.interruption">Interruption</a> - </h4> + If the function or callable object passed to the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> constructor propagates + an exception when invoked that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>, + <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> + is called. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.tutorial.join"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial.join" title="Joining and detaching">Joining and + detaching</a> +</h4></div></div></div> <p> - A running thread can be <span class="emphasis"><em>interrupted</em></span> by invoking the <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt()"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> member function of the corresponding - <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - object. When the interrupted thread next executes one of the specified <a class="link" href="thread_management.html#interruption_points"><span class="emphasis"><em>interruption points</em></span></a> - (or if it is currently <span class="emphasis"><em>blocked</em></span> whilst executing one) with - interruption enabled, then a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> - exception will be thrown in the interrupted thread. If not caught, this will - cause the execution of the interrupted thread to terminate. As with any other - exception, the stack will be unwound, and destructors for objects of automatic - storage duration will be executed. - </p> + When the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object that represents + a thread of execution is destroyed the thread becomes <span class="emphasis"><em>detached</em></span>. + Once a thread is detached, it will continue executing until the invocation + of the function or callable object supplied on construction has completed, + or the program is terminated. A thread can also be detached by explicitly + invoking the <a class="link" href="thread_management.html#thread.thread_management.thread.detach" title="Member function detach()"><code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code></a> + member function on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object. In this case, the + <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> + object ceases to represent the now-detached thread, and instead represents + <span class="emphasis"><em>Not-a-Thread</em></span>. + </p> <p> - If a thread wishes to avoid being interrupted, it can create an instance of - <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a>. - Objects of this class disable interruption for the thread that created them - on construction, and restore the interruption state to whatever it was before - on destruction: - </p> + In order to wait for a thread of execution to finish, the <a class="link" href="thread_management.html#thread.thread_management.thread.join" title="Member function join()"><code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a> + or <a class="link" href="thread_management.html#thread.thread_management.thread.timed_join" title="Member function timed_join()"><code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code></a> + member functions of the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object must be used. <a class="link" href="thread_management.html#thread.thread_management.thread.join" title="Member function join()"><code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a> will block the calling thread + until the thread represented by the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object has completed. If + the thread of execution represented by the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object has already completed, + or the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> + object represents <span class="emphasis"><em>Not-a-Thread</em></span>, then <a class="link" href="thread_management.html#thread.thread_management.thread.join" title="Member function join()"><code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a> + returns immediately. <a class="link" href="thread_management.html#thread.thread_management.thread.timed_join" title="Member function timed_join()"><code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code></a> + is similar, except that a call to <a class="link" href="thread_management.html#thread.thread_management.thread.timed_join" title="Member function timed_join()"><code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code></a> + will also return if the thread being waited for does not complete when + the specified time has elapsed. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.tutorial.interruption"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial.interruption" title="Interruption">Interruption</a> +</h4></div></div></div> +<p> + A running thread can be <span class="emphasis"><em>interrupted</em></span> by invoking the + <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt()"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> + member function of the corresponding <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object. When the interrupted + thread next executes one of the specified <a class="link" href="thread_management.html#interruption_points"><span class="emphasis"><em>interruption + points</em></span></a> (or if it is currently <span class="emphasis"><em>blocked</em></span> + whilst executing one) with interruption enabled, then a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> + exception will be thrown in the interrupted thread. If not caught, this + will cause the execution of the interrupted thread to terminate. As with + any other exception, the stack will be unwound, and destructors for objects + of automatic storage duration will be executed. + </p> +<p> + If a thread wishes to avoid being interrupted, it can create an instance + of <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a>. Objects + of this class disable interruption for the thread that created them on + construction, and restore the interruption state to whatever it was before + on destruction: + </p> <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span> <span class="special">{</span> <span class="comment">// interruption enabled here</span> @@ -200,14 +341,14 @@ <span class="special">}</span> </pre> <p> - The effects of an instance of <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a> - can be temporarily reversed by constructing an instance of <a class="link" href="thread_management.html#thread.thread_management.this_thread.restore_interruption" title="Class restore_interruption"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">restore_interruption</span></code></a>, - passing in the <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a> - object in question. This will restore the interruption state to what it was - when the <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a> - object was constructed, and then disable interruption again when the <a class="link" href="thread_management.html#thread.thread_management.this_thread.restore_interruption" title="Class restore_interruption"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">restore_interruption</span></code></a> - object is destroyed. - </p> + The effects of an instance of <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a> can be temporarily + reversed by constructing an instance of <a class="link" href="thread_management.html#thread.thread_management.this_thread.restore_interruption" title="Class restore_interruption EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">restore_interruption</span></code></a>, passing + in the <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a> object in + question. This will restore the interruption state to what it was when + the <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a> object was + constructed, and then disable interruption again when the <a class="link" href="thread_management.html#thread.thread_management.this_thread.restore_interruption" title="Class restore_interruption EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">restore_interruption</span></code></a> object is + destroyed. + </p> <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">g</span><span class="special">()</span> <span class="special">{</span> <span class="comment">// interruption enabled here</span> @@ -223,139 +364,181 @@ <span class="special">}</span> </pre> <p> - At any point, the interruption state for the current thread can be queried - by calling <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a>. - </p> -<a name="interruption_points"></a><h4> -<a name="thread.thread_management.h5"></a> - <span><a name="thread.thread_management.predefined_interruption_points"></a></span><a class="link" href="thread_management.html#thread.thread_management.predefined_interruption_points">Predefined - Interruption Points</a> - </h4> + At any point, the interruption state for the current thread can be queried + by calling <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a>. + </p> +<a name="interruption_points"></a><h6> +<a name="thread.thread_management.tutorial.interruption.h0"></a> + <span><a name="thread.thread_management.tutorial.interruption.predefined_interruption_points"></a></span><a class="link" href="thread_management.html#thread.thread_management.tutorial.interruption.predefined_interruption_points">Predefined + Interruption Points</a> + </h6> <p> - The following functions are <span class="emphasis"><em>interruption points</em></span>, which - will throw <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if interruption is enabled - for the current thread, and interruption is requested for the current thread: - </p> + The following functions are <span class="emphasis"><em>interruption points</em></span>, which + will throw <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if interruption is + enabled for the current thread, and interruption is requested for the current + thread: + </p> <div class="itemizedlist"><ul class="itemizedlist" type="disc"> <li class="listitem"> - <a class="link" href="thread_management.html#thread.thread_management.thread.join" title="Member function join()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">join</span><span class="special">()</span></code></a> - </li> + <a class="link" href="thread_management.html#thread.thread_management.thread.join" title="Member function join()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">join</span><span class="special">()</span></code></a> + </li> +<li class="listitem"> + <a class="link" href="thread_management.html#thread.thread_management.thread.timed_join" title="Member function timed_join()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_join</span><span class="special">()</span></code></a> + </li> <li class="listitem"> - <a class="link" href="thread_management.html#thread.thread_management.thread.timed_join" title="Member function timed_join()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">timed_join</span><span class="special">()</span></code></a> - </li> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.thread.try_join_for" title="Member function try_join_for() EXTENSION"><code class="computeroutput"><span class="identifier">try_join_for</span></code></a><span class="special">()</span></code>, + </li> <li class="listitem"> - <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait" title="void wait(boost::unique_lock<boost::mutex>& lock)"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">wait</span><span class="special">()</span></code></a> - </li> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.thread.try_join_until" title="Member function try_join_until() EXTENSION"><code class="computeroutput"><span class="identifier">try_join_until</span></code></a><span class="special">()</span></code>, + </li> <li class="listitem"> - <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait" title="bool timed_wait(boost::unique_lock<boost::mutex>& lock,boost::system_time const& abs_time)"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">timed_wait</span><span class="special">()</span></code></a> - </li> + <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait" title="void wait(boost::unique_lock<boost::mutex>& lock)"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">wait</span><span class="special">()</span></code></a> + </li> <li class="listitem"> - <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait" title="template<typename lock_type> void wait(lock_type& lock)"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable_any</span><span class="special">::</span><span class="identifier">wait</span><span class="special">()</span></code></a> - </li> + <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait" title="bool timed_wait(boost::unique_lock<boost::mutex>& lock,boost::system_time const& abs_time)"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">timed_wait</span><span class="special">()</span></code></a> + </li> <li class="listitem"> - <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait" title="template<typename lock_type> bool timed_wait(lock_type& lock,boost::system_time const& abs_time)"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable_any</span><span class="special">::</span><span class="identifier">timed_wait</span><span class="special">()</span></code></a> - </li> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable" title="Class condition_variable"><code class="computeroutput"><span class="identifier">condition_variable</span></code></a><span class="special">::</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for" title="template <class Rep, class Period> cv_status wait_for(boost::unique_lock<boost::mutex>& lock, const chrono::duration<Rep, Period>& rel_time)"><code class="computeroutput"><span class="identifier">wait_for</span></code></a><span class="special">()</span></code> + </li> <li class="listitem"> - <a class="link" href="thread_management.html#thread.thread_management.thread.sleep" title="Static member function sleep()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">sleep</span><span class="special">()</span></code></a> - </li> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable" title="Class condition_variable"><code class="computeroutput"><span class="identifier">condition_variable</span></code></a><span class="special">::</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until" title="template <class Clock, class Duration> cv_status wait_until(boost::unique_lock<boost::mutex>& lock, const chrono::time_point<Clock, Duration>& abs_time)"><code class="computeroutput"><span class="identifier">wait_until</span></code></a><span class="special">()</span></code> + </li> <li class="listitem"> - <a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep" title="Non-member function sleep()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep</span><span class="special">()</span></code></a> - </li> + <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait" title="template<typename lock_type> void wait(lock_type& lock)"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable_any</span><span class="special">::</span><span class="identifier">wait</span><span class="special">()</span></code></a> + </li> <li class="listitem"> - <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_point" title="Non-member function interruption_point()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_point</span><span class="special">()</span></code></a> - </li> + <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait" title="template<typename lock_type> bool timed_wait(lock_type& lock,boost::system_time const& abs_time)"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable_any</span><span class="special">::</span><span class="identifier">timed_wait</span><span class="special">()</span></code></a> + </li> +<li class="listitem"> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any" title="Class condition_variable_any"><code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a><span class="special">::</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for" title="template <class lock_type, class Rep, class Period> cv_status wait_for(lock_type& lock, const chrono::duration<Rep, Period>& rel_time)"><code class="computeroutput"><span class="identifier">wait_for</span></code></a><span class="special">()</span></code> + </li> +<li class="listitem"> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any" title="Class condition_variable_any"><code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a><span class="special">::</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until" title="template <class lock_type, class Clock, class Duration> cv_status wait_until(lock_type& lock, const chrono::time_point<Clock, Duration>& abs_time)"><code class="computeroutput"><span class="identifier">wait_until</span></code></a><span class="special">()</span></code> + </li> +<li class="listitem"> + <a class="link" href="thread_management.html#thread.thread_management.thread.sleep" title="Static member function sleep()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">sleep</span><span class="special">()</span></code></a> + </li> +<li class="listitem"> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_for" title="Non-member function sleep_for()"><code class="computeroutput"><span class="identifier">sleep_for</span></code></a><span class="special">()</span></code> + </li> +<li class="listitem"> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_until" title="Non-member function sleep_until()"><code class="computeroutput"><span class="identifier">sleep_until</span></code></a><span class="special">()</span></code> + </li> +<li class="listitem"> + <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_point" title="Non-member function interruption_point() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_point</span><span class="special">()</span></code></a> + </li> </ul></div> -<h4> -<a name="thread.thread_management.h6"></a> - <span><a name="thread.thread_management.thread_ids"></a></span><a class="link" href="thread_management.html#thread.thread_management.thread_ids">Thread - IDs</a> - </h4> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.tutorial.id"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial.id" title="Thread IDs">Thread IDs</a> +</h4></div></div></div> <p> - Objects of class <a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> - can be used to identify threads. Each running thread of execution has a unique - ID obtainable from the corresponding <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - by calling the <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code> - member function, or by calling <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code> from within the thread. Objects of class - <a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> - can be copied, and used as keys in associative containers: the full range of - comparison operators is provided. Thread IDs can also be written to an output - stream using the stream insertion operator, though the output format is unspecified. - </p> + Objects of class <a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> can be used to identify threads. + Each running thread of execution has a unique ID obtainable from the corresponding + <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> + by calling the <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code> + member function, or by calling <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code> from within the thread. Objects of class + <a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> + can be copied, and used as keys in associative containers: the full range + of comparison operators is provided. Thread IDs can also be written to + an output stream using the stream insertion operator, though the output + format is unspecified. + </p> <p> - Each instance of <a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> - either refers to some thread, or <span class="emphasis"><em>Not-a-Thread</em></span>. Instances - that refer to <span class="emphasis"><em>Not-a-Thread</em></span> compare equal to each other, - but not equal to any instances that refer to an actual thread of execution. - The comparison operators on <a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> - yield a total order for every non-equal thread ID. - </p> -<h4> -<a name="thread.thread_management.h7"></a> - <span><a name="thread.thread_management.using_native_interfaces_with_boost_thread_resources"></a></span><a class="link" href="thread_management.html#thread.thread_management.using_native_interfaces_with_boost_thread_resources">Using - native interfaces with Boost.Thread resources</a> - </h4> + Each instance of <a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> either refers to some thread, + or <span class="emphasis"><em>Not-a-Thread</em></span>. Instances that refer to <span class="emphasis"><em>Not-a-Thread</em></span> + compare equal to each other, but not equal to any instances that refer + to an actual thread of execution. The comparison operators on <a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> yield a total order for every + non-equal thread ID. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.tutorial.native_in"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial.native_in" title="Using native interfaces with Boost.Thread resources">Using + native interfaces with Boost.Thread resources</a> +</h4></div></div></div> <p> - <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - class has members <code class="computeroutput"><span class="identifier">native_handle_type</span></code> - and <code class="computeroutput"><span class="identifier">native_handle</span></code> providing - access to the underlying native handle. - </p> + <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> + class has members <code class="computeroutput"><span class="identifier">native_handle_type</span></code> + and <code class="computeroutput"><span class="identifier">native_handle</span></code> providing + access to the underlying native handle. + </p> <p> - This native handle can be used to change for example the scheduling. - </p> + This native handle can be used to change for example the scheduling. + </p> <p> - In general, it is not safe to use this handle with operations that can conflict - with the ones provided by Boost.Thread. An example of bad usage could be detaching - a thread directly as it will not change the internals of the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - instance, so for example the joinable function will continue to return true, - while the native thread is no more joinable. - </p> + In general, it is not safe to use this handle with operations that can + conflict with the ones provided by Boost.Thread. An example of bad usage + could be detaching a thread directly as it will not change the internals + of the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> + instance, so for example the joinable function will continue to return + true, while the native thread is no more joinable. + </p> <pre class="programlisting"><span class="identifier">thread</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">fct</span><span class="special">);</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">native_handle_type</span> <span class="identifier">hnd</span><span class="special">=</span><span class="identifier">t</span><span class="special">.</span><span class="identifier">native_handle</span><span class="special">();</span> <span class="identifier">pthread_detach</span><span class="special">(</span><span class="identifier">hnd</span><span class="special">);</span> <span class="identifier">assert</span><span class="special">(</span><span class="identifier">t</span><span class="special">.</span><span class="identifier">joinable</span><span class="special">());</span> </pre> -<h4> -<a name="thread.thread_management.h8"></a> - <span><a name="thread.thread_management.using_boost_thread_interfaces_in_a_native_thread"></a></span><a class="link" href="thread_management.html#thread.thread_management.using_boost_thread_interfaces_in_a_native_thread">Using - Boost.Thread interfaces in a native thread</a> - </h4> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.tutorial.native_from"></a><a class="link" href="thread_management.html#thread.thread_management.tutorial.native_from" title="Using Boost.Thread interfaces in a native thread">Using + Boost.Thread interfaces in a native thread</a> +</h4></div></div></div> <p> - Any thread of execution created using the native interface is called a native - thread in this documentation. - </p> + Any thread of execution created using the native interface is called a + native thread in this documentation. + </p> <p> - The first example of a native thread of execution is the main thread. - </p> + The first example of a native thread of execution is the main thread. + </p> <p> - The user can access to some synchronization functions related to the native - current thread using the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span></code> - <code class="computeroutput"><span class="identifier">yield</span></code>, <code class="computeroutput"><span class="identifier">sleep</span></code>, - functions. - </p> + The user can access to some synchronization functions related to the native + current thread using the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span></code> + <code class="computeroutput"><span class="identifier">yield</span></code>, <code class="computeroutput"><span class="identifier">sleep</span></code>, + <a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_for" title="Non-member function sleep_for()"><code class="computeroutput"><span class="identifier">sleep_for</span></code></a>, <a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_until" title="Non-member function sleep_until()"><code class="computeroutput"><span class="identifier">sleep_until</span></code></a>, functions. + </p> <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> <span class="comment">// ... </span> - <span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep</span><span class="special">();</span> + <span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span><span class="special">(</span><span class="number">10</span><span class="special">));</span> <span class="comment">// ... </span> <span class="special">}</span> </pre> <p> - Of course all the synchronization facilities provided by Boost.Thread are also - available on native threads. - </p> + Of course all the synchronization facilities provided by Boost.Thread are + also available on native threads. + </p> +<p> + The <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span></code> interrupt related functions + behave in a degraded mode when called from a thread created using the native + interface, i.e. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code> + returns false. As consequence the use of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code> + and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">restore_interruption</span></code> will do nothing + and calls to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interrupt_point</span><span class="special">()</span></code> + will be just ignored. + </p> +<p> + As the single way to interrupt a thread is through a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> instance, <code class="computeroutput"><span class="identifier">interruption_request</span><span class="special">()</span></code> + wiil returns false for the native threads. + </p> +<h6> +<a name="thread.thread_management.tutorial.native_from.h0"></a> + <span><a name="thread.thread_management.tutorial.native_from._code__phrase_role__identifier__pthread_exit__phrase___code__posix_limitation"></a></span><a class="link" href="thread_management.html#thread.thread_management.tutorial.native_from._code__phrase_role__identifier__pthread_exit__phrase___code__posix_limitation"><code class="computeroutput"><span class="identifier">pthread_exit</span></code> POSIX limitation</a> + </h6> <p> - The <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span></code> interrupt related functions behave - in a degraded mode when called from a thread created using the native interface, - i.e. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code> - returns false. As consequence the use of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code> - and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">restore_interruption</span></code> will do nothing and - calls to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interrupt_point</span><span class="special">()</span></code> - will be just ignored. - </p> + <code class="computeroutput"><span class="identifier">pthread_exit</span></code> in glibc/NPTL + causes a "forced unwind" that is almost like a C++ exception, + but not quite. On Mac OS X, for example, <code class="computeroutput"><span class="identifier">pthread_exit</span></code> + unwinds without calling C++ destructors. + </p> <p> - As the single way to interrupt a thread is through a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> - instance, <code class="computeroutput"><span class="identifier">interruption_request</span><span class="special">()</span></code> wiil returns false for the native threads. - </p> + This behavior is incompatible with the current Boost.Thread design, so + the use of this function in a POSIX thread result in undefined behavior + of any Boost.Thread function. + </p> +</div> +</div> <div class="section"> <div class="titlepage"><div><div><h3 class="title"> <a name="thread.thread_management.thread"></a><a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread">Class <code class="computeroutput"><span class="identifier">thread</span></code></a> @@ -369,6 +552,12 @@ assignment operator</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.callable_constructor">Thread Constructor</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.attr_callable_constructor">Thread + Attributes Constructor EXTENSION</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.callable_move_constructor">Thread + Callable Move Constructor</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.attr_callable_move_constructor">Thread + Attributes Move Constructor EXTENSION</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.multiple_argument_constructor">Thread Constructor with arguments</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.destructor">Thread @@ -379,6 +568,12 @@ <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.timed_join">Member function <code class="computeroutput"><span class="identifier">timed_join</span><span class="special">()</span></code></a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.try_join_for">Member + function <code class="computeroutput"><span class="identifier">try_join_for</span><span class="special">()</span></code> + EXTENSION</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.try_join_until">Member + function <code class="computeroutput"><span class="identifier">try_join_until</span><span class="special">()</span></code> + EXTENSION</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.detach">Member function <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.get_id">Member function @@ -389,8 +584,10 @@ member function <code class="computeroutput"><span class="identifier">hardware_concurrency</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.nativehandle">Member function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt> -<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.equals"><code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code></a></span></dt> -<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.not_equals"><code class="computeroutput"><span class="keyword">operator</span><span class="special">!=</span></code></a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.equals"><code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code> + DEPRECATED V3</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.not_equals"><code class="computeroutput"><span class="keyword">operator</span><span class="special">!=</span></code> + DEPRECATED V3</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.sleep">Static member function <code class="computeroutput"><span class="identifier">sleep</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.yield">Static member @@ -399,72 +596,93 @@ <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.non_member_swap">Non-member function <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a></span></dt> -<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.non_member_move">Non-member - function <code class="computeroutput"><span class="identifier">move</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.id">Class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.attributes">Class + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">attributes</span></code> EXTENSION</a></span></dt> </dl></div> <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="keyword">class</span> <span class="identifier">thread</span> <span class="special">{</span> <span class="keyword">public</span><span class="special">:</span> - <span class="identifier">thread</span><span class="special">();</span> + <span class="identifier">thread</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="identifier">thread</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> + <span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> + + <span class="identifier">thread</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&&)</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">thread</span><span class="special">&&)</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="special">~</span><span class="identifier">thread</span><span class="special">();</span> <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> <span class="keyword">explicit</span> <span class="identifier">thread</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> + <span class="identifier">thread</span><span class="special">(</span><span class="identifier">F</span> <span class="special">&&</span><span class="identifier">f</span><span class="special">);</span> <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">A1</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">A2</span><span class="special">,...></span> <span class="identifier">thread</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">,</span><span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">,</span><span class="identifier">A2</span> <span class="identifier">a2</span><span class="special">,...);</span> + <span class="comment">// template <class F, class ...Args> </span> + <span class="comment">// explicit thread(F&& f, Args&&... args); // NOT YET IMPLEMENTED</span> <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> - <span class="identifier">thread</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span> <span class="identifier">f</span><span class="special">);</span> + <span class="keyword">explicit</span> <span class="identifier">thread</span><span class="special">(</span><span class="identifier">attributes</span><span class="special">&</span> <span class="identifier">attrs</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> <span class="comment">// EXTENSION</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> + <span class="identifier">thread</span><span class="special">(</span><span class="identifier">attributes</span><span class="special">&</span> <span class="identifier">attrs</span><span class="special">,</span> <span class="identifier">F</span> <span class="special">&&</span><span class="identifier">f</span><span class="special">);</span> <span class="comment">// EXTENSION</span> + <span class="comment">// template <class F, class ...Args> </span> + <span class="comment">// explicit thread(attributes& attrs, F&& f, Args&&... args); // NOT YET IMPLEMENTED</span> <span class="comment">// move support</span> - <span class="identifier">thread</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">x</span><span class="special">);</span> - <span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">x</span><span class="special">);</span> - <span class="keyword">operator</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">>();</span> - <span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">move</span><span class="special">();</span> + <span class="identifier">thread</span><span class="special">(</span><span class="identifier">thread</span> <span class="special">&&</span> <span class="identifier">x</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">thread</span> <span class="special">&&</span> <span class="identifier">x</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> - <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">x</span><span class="special">);</span> + <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="keyword">class</span> <span class="identifier">id</span><span class="special">;</span> - <span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> + <span class="keyword">class</span> <span class="identifier">attributes</span><span class="special">;</span> - <span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> - <span class="keyword">void</span> <span class="identifier">join</span><span class="special">();</span> - <span class="keyword">bool</span> <span class="identifier">timed_join</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span> + <span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> - <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span> - <span class="keyword">bool</span> <span class="identifier">timed_join</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span> + <span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">void</span> <span class="identifier">join</span><span class="special">();</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> + <span class="keyword">bool</span> <span class="identifier">try_join_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span> <span class="comment">// EXTENSION</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> + <span class="keyword">bool</span> <span class="identifier">try_join_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">t</span><span class="special">);</span> <span class="comment">// EXTENSION</span> <span class="keyword">void</span> <span class="identifier">detach</span><span class="special">();</span> - <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">hardware_concurrency</span><span class="special">();</span> + <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">hardware_concurrency</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span> <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> - <span class="keyword">void</span> <span class="identifier">interrupt</span><span class="special">();</span> - <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> + <span class="keyword">void</span> <span class="identifier">interrupt</span><span class="special">();</span> <span class="comment">// EXTENSION</span> + <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + + +<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span> + <span class="keyword">bool</span> <span class="identifier">timed_join</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">wait_until</span><span class="special">);</span> + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span> + <span class="keyword">bool</span> <span class="identifier">timed_join</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span> +<span class="preprocessor">#endif</span> - <span class="comment">// backwards compatibility</span> +<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">yield</span><span class="special">();</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">sleep</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">system_time</span><span class="special">&</span> <span class="identifier">xt</span><span class="special">);</span> +<span class="preprocessor">#endif</span> + <span class="special">};</span> -<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> -<span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">move</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">t</span><span class="special">);</span> +<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> <a name="thread.thread_management.thread.default_constructor"></a><a class="link" href="thread_management.html#thread.thread_management.thread.default_constructor" title="Default Constructor">Default Constructor</a> </h4></div></div></div> -<pre class="programlisting"><span class="identifier">thread</span><span class="special">();</span> +<pre class="programlisting"><span class="identifier">thread</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -474,6 +692,10 @@ Constructs a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> instance that refers to <span class="emphasis"><em>Not-a-Thread</em></span>. </p></dd> +<dt><span class="term">Postconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()==</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span></code> + </p></dd> <dt><span class="term">Throws:</span></dt> <dd><p> Nothing @@ -486,7 +708,7 @@ <a name="thread.thread_management.thread.move_constructor"></a><a class="link" href="thread_management.html#thread.thread_management.thread.move_constructor" title="Move Constructor">Move Constructor</a> </h4></div></div></div> -<pre class="programlisting"><span class="identifier">thread</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">other</span><span class="special">);</span> +<pre class="programlisting"><span class="identifier">thread</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -498,7 +720,9 @@ </p></dd> <dt><span class="term">Postconditions:</span></dt> <dd><p> - <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()==</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span></code> + <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()==</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span></code> + and <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code> + returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span></code> prior to the construction </p></dd> <dt><span class="term">Throws:</span></dt> <dd><p> @@ -512,7 +736,7 @@ <a name="thread.thread_management.thread.move_assignment"></a><a class="link" href="thread_management.html#thread.thread_management.thread.move_assignment" title="Move assignment operator">Move assignment operator</a> </h4></div></div></div> -<pre class="programlisting"><span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">other</span><span class="special">);</span> +<pre class="programlisting"><span class="identifier">thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">thread</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -521,11 +745,15 @@ <dd><p> Transfers ownership of the thread managed by <code class="computeroutput"><span class="identifier">other</span></code> (if any) to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. - If there was a thread previously associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> then that thread is detached. + Version 1: If there was a thread previously associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + then that thread is detached, version 2: If the thread is joinable + calls to std::terminate. </p></dd> <dt><span class="term">Postconditions:</span></dt> <dd><p> <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()==</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span></code> + and <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code> + returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span></code> prior to the assignment. </p></dd> <dt><span class="term">Throws:</span></dt> <dd><p> @@ -545,6 +773,52 @@ <div class="variablelist"> <p class="title"><b></b></p> <dl> +<dt><span class="term">Requires:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">Callable</span></code> must by + Copyable and <code class="computeroutput"><span class="identifier">func</span><span class="special">()</span></code> must be a valid expression. + </p></dd> +<dt><span class="term">Effects:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">func</span></code> is copied into + storage managed internally by the thread library, and that copy is + invoked on a newly-created thread of execution. If this invocation + results in an exception being propagated into the internals of the + thread library that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>, + then <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> + will be called. Any return value from this invocation is ignored. + </p></dd> +<dt><span class="term">Postconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to the newly created thread of execution and <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()!=</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span></code>. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error + occurs. + </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_unavailable_try_again</strong></span> : + the system lacked the necessary resources to create an- other thread, + or the system-imposed limit on the number of threads in a process + would be exceeded. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.thread.attr_callable_constructor"></a><a class="link" href="thread_management.html#thread.thread_management.thread.attr_callable_constructor" title="Thread Attributes Constructor EXTENSION">Thread + Attributes Constructor EXTENSION</a> +</h4></div></div></div> +<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">></span> +<span class="identifier">thread</span><span class="special">(</span><span class="identifier">attributes</span><span class="special">&</span> <span class="identifier">attrs</span><span class="special">,</span> <span class="identifier">Callable</span> <span class="identifier">func</span><span class="special">);</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> <dt><span class="term">Preconditions:</span></dt> <dd><p> <code class="computeroutput"><span class="identifier">Callable</span></code> must by @@ -554,22 +828,123 @@ <dd><p> <code class="computeroutput"><span class="identifier">func</span></code> is copied into storage managed internally by the thread library, and that copy is + invoked on a newly-created thread of execution with the specified + attributes. If this invocation results in an exception being propagated + into the internals of the thread library that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>, then <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> + will be called. Any return value from this invocation is ignored. + If the attributes declare the native thread as detached, the boost::thread + will be detached. + </p></dd> +<dt><span class="term">Postconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to the newly created thread of execution and <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()!=</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span></code>. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error + occurs. + </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_unavailable_try_again</strong></span> : + the system lacked the necessary resources to create an- other thread, + or the system-imposed limit on the number of threads in a process + would be exceeded. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.thread.callable_move_constructor"></a><a class="link" href="thread_management.html#thread.thread_management.thread.callable_move_constructor" title="Thread Callable Move Constructor">Thread + Callable Move Constructor</a> +</h4></div></div></div> +<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">></span> +<span class="identifier">thread</span><span class="special">(</span><span class="identifier">Callable</span> <span class="special">&&</span><span class="identifier">func</span><span class="special">);</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Preconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">Callable</span></code> must by + Movable. + </p></dd> +<dt><span class="term">Effects:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">func</span></code> is moved into + storage managed internally by the thread library, and that copy is invoked on a newly-created thread of execution. If this invocation results in an exception being propagated into the internals of the thread library that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>, then <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> - will be called. + will be called. Any return value from this invocation is ignored. </p></dd> <dt><span class="term">Postconditions:</span></dt> <dd><p> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> - refers to the newly created thread of execution. + refers to the newly created thread of execution and <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()!=</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span></code>. </p></dd> <dt><span class="term">Throws:</span></dt> <dd><p> <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error occurs. </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_unavailable_try_again</strong></span> : + the system lacked the necessary resources to create an- other thread, + or the system-imposed limit on the number of threads in a process + would be exceeded. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.thread.attr_callable_move_constructor"></a><a class="link" href="thread_management.html#thread.thread_management.thread.attr_callable_move_constructor" title="Thread Attributes Move Constructor EXTENSION">Thread + Attributes Move Constructor EXTENSION</a> +</h4></div></div></div> +<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">></span> +<span class="identifier">thread</span><span class="special">(</span><span class="identifier">attributes</span><span class="special">&</span> <span class="identifier">attrs</span><span class="special">,</span> <span class="identifier">Callable</span> <span class="identifier">func</span><span class="special">);</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Preconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">Callable</span></code> must by + copyable. + </p></dd> +<dt><span class="term">Effects:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">func</span></code> is copied into + storage managed internally by the thread library, and that copy is + invoked on a newly-created thread of execution with the specified + attributes. If this invocation results in an exception being propagated + into the internals of the thread library that is not of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code>, then <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> + will be called. Any return value from this invocation is ignored. + If the attributes declare the native thread as detached, the boost::thread + will be detached. + </p></dd> +<dt><span class="term">Postconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to the newly created thread of execution and <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()!=</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span><span class="special">()</span></code>. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error + occurs. + </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_unavailable_try_again</strong></span> : + the system lacked the necessary resources to create an- other thread, + or the system-imposed limit on the number of threads in a process + would be exceeded. + </p></dd> </dl> </div> </div> @@ -605,6 +980,13 @@ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error occurs. </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_unavailable_try_again</strong></span> : + the system lacked the necessary resources to create an- other thread, + or the system-imposed limit on the number of threads in a process + would be exceeded. + </p></dd> <dt><span class="term">Note:</span></dt> <dd><p> Currently up to nine additional arguments <code class="computeroutput"><span class="identifier">a1</span></code> @@ -626,9 +1008,10 @@ <dl> <dt><span class="term">Effects:</span></dt> <dd><p> - If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> - has an associated thread of execution, calls <a class="link" href="thread_management.html#thread.thread_management.thread.detach" title="Member function detach()"><code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code></a>. - Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. + Version 1: If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + has an associated thread of execution, calls <a class="link" href="thread_management.html#thread.thread_management.thread.detach" title="Member function detach()"><code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code></a>, + Version 2: If the thread is joinable calls to std::terminate. Destroys + <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. </p></dd> <dt><span class="term">Throws:</span></dt> <dd><p> @@ -642,7 +1025,7 @@ <a name="thread.thread_management.thread.joinable"></a><a class="link" href="thread_management.html#thread.thread_management.thread.joinable" title="Member function joinable()">Member function <code class="computeroutput"><span class="identifier">joinable</span><span class="special">()</span></code></a> </h4></div></div></div> -<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> +<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -672,7 +1055,7 @@ <dl> <dt><span class="term">Preconditions:</span></dt> <dd><p> - <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()!=</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code> + the thread is joinable. </p></dd> <dt><span class="term">Effects:</span></dt> <dd><p> @@ -690,7 +1073,12 @@ <dt><span class="term">Throws:</span></dt> <dd><p> <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current - thread of execution is interrupted. + thread of execution is interrupted or <code class="computeroutput"><span class="identifier">system_error</span></code> + </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if + deadlock is detected or this->get_id() == std::this_thread::get_id(). </p></dd> <dt><span class="term">Notes:</span></dt> <dd><p> @@ -747,7 +1135,12 @@ <dt><span class="term">Throws:</span></dt> <dd><p> <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current - thread of execution is interrupted. + thread of execution is interrupted or <code class="computeroutput"><span class="identifier">system_error</span></code> + </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if + deadlock is detected or this->get_id() == std::this_thread::get_id(). </p></dd> <dt><span class="term">Notes:</span></dt> <dd><p> @@ -760,19 +1153,143 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.thread.try_join_for"></a><a class="link" href="thread_management.html#thread.thread_management.thread.try_join_for" title="Member function try_join_for() EXTENSION">Member + function <code class="computeroutput"><span class="identifier">try_join_for</span><span class="special">()</span></code> + EXTENSION</a> +</h4></div></div></div> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> +<span class="keyword">bool</span> <span class="identifier">try_join_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Preconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()!=</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code> + </p></dd> +<dt><span class="term">Effects:</span></dt> +<dd><p> + If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to a thread of execution, waits for that thread of execution + to complete, the specified duration <code class="computeroutput"><span class="identifier">rel_time</span></code> + has elapsed. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + doesn't refer to a thread of execution, returns immediately. + </p></dd> +<dt><span class="term">Returns:</span></dt> +<dd><p> + <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to a thread of execution on entry, and that thread of execution + has completed before the call times out, <code class="computeroutput"><span class="keyword">false</span></code> + otherwise. + </p></dd> +<dt><span class="term">Postconditions:</span></dt> +<dd><p> + If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to a thread of execution on entry, and <code class="computeroutput"><span class="identifier">try_join_for</span></code> + returns <code class="computeroutput"><span class="keyword">true</span></code>, that thread + of execution has completed, and <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> no longer refers to any thread + of execution. If this call to <code class="computeroutput"><span class="identifier">try_join_for</span></code> + returns <code class="computeroutput"><span class="keyword">false</span></code>, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + is unchanged. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current + thread of execution is interrupted or <code class="computeroutput"><span class="identifier">system_error</span></code> + </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if + deadlock is detected or this->get_id() == std::this_thread::get_id(). + </p></dd> +<dt><span class="term">Notes:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">try_join_for</span><span class="special">()</span></code> + is one of the predefined <a class="link" href="thread_management.html#interruption_points"><span class="emphasis"><em>interruption + points</em></span></a>. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.thread.try_join_until"></a><a class="link" href="thread_management.html#thread.thread_management.thread.try_join_until" title="Member function try_join_until() EXTENSION">Member + function <code class="computeroutput"><span class="identifier">try_join_until</span><span class="special">()</span></code> + EXTENSION</a> +</h4></div></div></div> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> +<span class="keyword">bool</span> <span class="identifier">try_join_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Preconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_id</span><span class="special">()!=</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">get_id</span><span class="special">()</span></code> + </p></dd> +<dt><span class="term">Effects:</span></dt> +<dd><p> + If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to a thread of execution, waits for that thread of execution + to complete, the time <code class="computeroutput"><span class="identifier">abs_time</span></code> + has been reach. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> doesn't refer to a thread of + execution, returns immediately. + </p></dd> +<dt><span class="term">Returns:</span></dt> +<dd><p> + <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to a thread of execution on entry, and that thread of execution + has completed before the call times out, <code class="computeroutput"><span class="keyword">false</span></code> + otherwise. + </p></dd> +<dt><span class="term">Postconditions:</span></dt> +<dd><p> + If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + refers to a thread of execution on entry, and <code class="computeroutput"><span class="identifier">try_join_until</span></code> + returns <code class="computeroutput"><span class="keyword">true</span></code>, that thread + of execution has completed, and <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> no longer refers to any thread + of execution. If this call to <code class="computeroutput"><span class="identifier">try_join_until</span></code> + returns <code class="computeroutput"><span class="keyword">false</span></code>, <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> + is unchanged. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current + thread of execution is interrupted or <code class="computeroutput"><span class="identifier">system_error</span></code> + </p></dd> +<dt><span class="term">Error Conditions:</span></dt> +<dd><p> + <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: if + deadlock is detected or this->get_id() == std::this_thread::get_id(). + </p></dd> +<dt><span class="term">Notes:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">try_join_until</span><span class="special">()</span></code> + is one of the predefined <a class="link" href="thread_management.html#interruption_points"><span class="emphasis"><em>interruption + points</em></span></a>. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> <a name="thread.thread_management.thread.detach"></a><a class="link" href="thread_management.html#thread.thread_management.thread.detach" title="Member function detach()">Member function <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code></a> </h4></div></div></div> -<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">detach</span><span class="special">();</span> +<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">detach</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> <dl> +<dt><span class="term">Preconditions:</span></dt> +<dd><p> + the thread is joinable. + </p></dd> <dt><span class="term">Effects:</span></dt> <dd><p> - If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> - refers to a thread of execution, that thread of execution becomes - detached, and no longer has an associated <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object. + The thread of execution becomes detached, and no longer has an associated + <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> + object. </p></dd> <dt><span class="term">Postconditions:</span></dt> <dd><p> @@ -791,7 +1308,7 @@ <a name="thread.thread_management.thread.get_id"></a><a class="link" href="thread_management.html#thread.thread_management.thread.get_id" title="Member function get_id()">Member function <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code></a> </h4></div></div></div> -<pre class="programlisting"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> +<pre class="programlisting"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -841,7 +1358,7 @@ <a name="thread.thread_management.thread.hardware_concurrency"></a><a class="link" href="thread_management.html#thread.thread_management.thread.hardware_concurrency" title="Static member function hardware_concurrency()">Static member function <code class="computeroutput"><span class="identifier">hardware_concurrency</span><span class="special">()</span></code></a> </h4></div></div></div> -<pre class="programlisting"><span class="keyword">unsigned</span> <span class="identifier">hardware_concurrency</span><span class="special">();</span> +<pre class="programlisting"><span class="keyword">unsigned</span> <span class="identifier">hardware_concurrency</span><span class="special">()</span> <span class="identifier">noexecpt</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -886,7 +1403,8 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.thread.equals"></a><a class="link" href="thread_management.html#thread.thread_management.thread.equals" title="operator=="><code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code></a> +<a name="thread.thread_management.thread.equals"></a><a class="link" href="thread_management.html#thread.thread_management.thread.equals" title="operator== DEPRECATED V3"><code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code> + DEPRECATED V3</a> </h4></div></div></div> <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> </pre> @@ -897,12 +1415,18 @@ <dd><p> <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()==</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span></code> </p></dd> +<dt><span class="term">See:</span></dt> +<dd><p> + Use <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><a class="link" href="thread_management.html#thread.thread_management.thread.get_id" title="Member function get_id()"><code class="computeroutput"><span class="identifier">get_id</span></code></a><span class="special">()==</span><span class="identifier">b</span><span class="special">.</span><a class="link" href="thread_management.html#thread.thread_management.thread.get_id" title="Member function get_id()"><code class="computeroutput"><span class="identifier">get_id</span></code></a><span class="special">()</span></code> + instead + </p></dd> </dl> </div> </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.thread.not_equals"></a><a class="link" href="thread_management.html#thread.thread_management.thread.not_equals" title="operator!="><code class="computeroutput"><span class="keyword">operator</span><span class="special">!=</span></code></a> +<a name="thread.thread_management.thread.not_equals"></a><a class="link" href="thread_management.html#thread.thread_management.thread.not_equals" title="operator!= DEPRECATED V3"><code class="computeroutput"><span class="keyword">operator</span><span class="special">!=</span></code> + DEPRECATED V3</a> </h4></div></div></div> <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">thread</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> </pre> @@ -913,6 +1437,11 @@ <dd><p> <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()!=</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span></code> </p></dd> +<dt><span class="term">See:</span></dt> +<dd><p> + Use <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><a class="link" href="thread_management.html#thread.thread_management.thread.get_id" title="Member function get_id()"><code class="computeroutput"><span class="identifier">get_id</span></code></a><span class="special">()!=</span><span class="identifier">b</span><span class="special">.</span><a class="link" href="thread_management.html#thread.thread_management.thread.get_id" title="Member function get_id()"><code class="computeroutput"><span class="identifier">get_id</span></code></a><span class="special">()</span></code> + instead` + </p></dd> </dl> </div> </div> @@ -941,6 +1470,11 @@ is one of the predefined <a class="link" href="thread_management.html#interruption_points"><span class="emphasis"><em>interruption points</em></span></a>. </p></dd> +<dt><span class="term">See:</span></dt> +<dd><p> + Use <code class="computeroutput"><span class="identifier">this_thread</span><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_for" title="Non-member function sleep_for()"><code class="computeroutput"><span class="identifier">sleep_for</span></code></a><span class="special">()</span></code> + or <code class="computeroutput"><span class="identifier">this_thread</span><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_until" title="Non-member function sleep_until()"><code class="computeroutput"><span class="identifier">sleep_until</span></code></a><span class="special">()</span></code> + </p></dd> </dl> </div> </div> @@ -958,6 +1492,10 @@ <dd><p> See <a class="link" href="thread_management.html#thread.thread_management.this_thread.yield" title="Non-member function yield()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">yield</span><span class="special">()</span></code></a>. </p></dd> +<dt><span class="term">See:</span></dt> +<dd><p> + Use <code class="computeroutput"><span class="identifier">this_thread</span><span class="special">::</span><a class="link" href="thread_management.html#thread.thread_management.this_thread.yield" title="Non-member function yield()"><code class="computeroutput"><span class="identifier">yield</span></code></a><span class="special">()</span></code> + </p></dd> </dl> </div> </div> @@ -966,7 +1504,7 @@ <a name="thread.thread_management.thread.swap"></a><a class="link" href="thread_management.html#thread.thread_management.thread.swap" title="Member function swap()">Member function <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a> </h4></div></div></div> -<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span> +<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -997,7 +1535,7 @@ </h4></div></div></div> <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> -<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> +<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span><span class="identifier">thread</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1011,32 +1549,6 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.thread.non_member_move"></a><a class="link" href="thread_management.html#thread.thread_management.thread.non_member_move" title="Non-member function move()">Non-member - function <code class="computeroutput"><span class="identifier">move</span><span class="special">()</span></code></a> -</h4></div></div></div> -<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> - -<span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">move</span><span class="special">(</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">thread_move_t</span><span class="special"><</span><span class="identifier">thread</span><span class="special">></span> <span class="identifier">t</span><span class="special">)</span> -</pre> -<div class="variablelist"> -<p class="title"><b></b></p> -<dl> -<dt><span class="term">Returns:</span></dt> -<dd><p> - <code class="computeroutput"><span class="identifier">t</span></code>. - </p></dd> -</dl> -</div> -<p> - Enables moving thread objects. e.g. - </p> -<pre class="programlisting"><span class="keyword">extern</span> <span class="keyword">void</span> <span class="identifier">some_func</span><span class="special">();</span> -<span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">some_func</span><span class="special">);</span> -<span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">t2</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">t</span><span class="special">));</span> <span class="comment">// transfer thread from t to t2</span> -</pre> -</div> -<div class="section"> -<div class="titlepage"><div><div><h4 class="title"> <a name="thread.thread_management.thread.id"></a><a class="link" href="thread_management.html#thread.thread_management.thread.id" title="Class boost::thread::id">Class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span></code></a> </h4></div></div></div> <div class="toc"><dl> @@ -1056,14 +1568,14 @@ <span class="keyword">class</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="special">{</span> <span class="keyword">public</span><span class="special">:</span> - <span class="identifier">id</span><span class="special">();</span> + <span class="identifier">id</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> - <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> - <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> - <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> - <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> - <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> - <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> + <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traits</span><span class="special">></span> <span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traits</span><span class="special">>&</span> @@ -1075,7 +1587,7 @@ <a name="thread.thread_management.thread.id.constructor"></a><a class="link" href="thread_management.html#thread.thread_management.thread.id.constructor" title="Default constructor">Default constructor</a> </h5></div></div></div> -<pre class="programlisting"><span class="identifier">id</span><span class="special">();</span> +<pre class="programlisting"><span class="identifier">id</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1096,7 +1608,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.thread.id.is_equal"></a><a class="link" href="thread_management.html#thread.thread_management.thread.id.is_equal" title="operator=="><code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code></a> </h5></div></div></div> -<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> +<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1119,7 +1631,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.thread.id.not_equal"></a><a class="link" href="thread_management.html#thread.thread_management.thread.id.not_equal" title="operator!="><code class="computeroutput"><span class="keyword">operator</span><span class="special">!=</span></code></a> </h5></div></div></div> -<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> +<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1142,7 +1654,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.thread.id.less_than"></a><a class="link" href="thread_management.html#thread.thread_management.thread.id.less_than" title="operator<"><code class="computeroutput"><span class="keyword">operator</span><span class="special"><</span></code></a> </h5></div></div></div> -<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> +<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1171,7 +1683,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.thread.id.greater_than"></a><a class="link" href="thread_management.html#thread.thread_management.thread.id.greater_than" title="operator>"><code class="computeroutput"><span class="keyword">operator</span><span class="special">></span></code></a> </h5></div></div></div> -<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> +<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1191,7 +1703,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.thread.id.less_than_or_equal"></a><a class="link" href="thread_management.html#thread.thread_management.thread.id.less_than_or_equal" title="operator<="><code class="computeroutput"><span class="keyword">operator</span><span class="special"><=</span></code></a> </h5></div></div></div> -<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> +<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1211,7 +1723,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.thread.id.greater_than_or_equal"></a><a class="link" href="thread_management.html#thread.thread_management.thread.id.greater_than_or_equal" title="operator>="><code class="computeroutput"><span class="keyword">operator</span><span class="special">>=</span></code></a> </h5></div></div></div> -<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> +<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">>=(</span><span class="keyword">const</span> <span class="identifier">id</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1254,6 +1766,139 @@ </div> </div> </div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.thread.attributes"></a><a class="link" href="thread_management.html#thread.thread_management.thread.attributes" title="Class boost::thread::attributes EXTENSION">Class + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">attributes</span></code> EXTENSION</a> +</h4></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.attributes.constructor">Default + constructor</a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.attributes.set_stack_size">Member + function <code class="computeroutput"><span class="identifier">set_stack_size</span><span class="special">()</span></code></a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.attributes.get_stack_size">Member + function <code class="computeroutput"><span class="identifier">get_stack_size</span><span class="special">()</span></code></a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.thread.attributes.nativehandle">Member + function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt> +</dl></div> +<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">attributes</span> <span class="special">{</span> +<span class="keyword">public</span><span class="special">:</span> + <span class="identifier">attributes</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="special">~</span> <span class="identifier">attributes</span><span class="special">()=</span><span class="keyword">default</span><span class="special">;</span> + <span class="comment">// stack</span> + <span class="keyword">void</span> <span class="identifier">set_stack_size</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">get_stack_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> + +<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DEFINES_THREAD_ATTRIBUTES_NATIVE_HANDLE</span> + <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span> + <span class="identifier">native_handle_type</span><span class="special">*</span> <span class="identifier">native_handle</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">*</span> <span class="identifier">native_handle</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> +<span class="preprocessor">#endif</span> + +<span class="special">};</span> +</pre> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="thread.thread_management.thread.attributes.constructor"></a><a class="link" href="thread_management.html#thread.thread_management.thread.attributes.constructor" title="Default constructor">Default + constructor</a> +</h5></div></div></div> +<pre class="programlisting"><span class="identifier">thread_attributes</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Effects:</span></dt> +<dd><p> + Constructs a thread atrributes instance with its default values. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + Nothing + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="thread.thread_management.thread.attributes.set_stack_size"></a><a class="link" href="thread_management.html#thread.thread_management.thread.attributes.set_stack_size" title="Member function set_stack_size()">Member + function <code class="computeroutput"><span class="identifier">set_stack_size</span><span class="special">()</span></code></a> +</h5></div></div></div> +<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_stack_size</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Effects:</span></dt> +<dd><p> + Stores the stack size to be used to create a thread. This is an + hint that the implementation can choose a better size if to small + or too big or not aligned to a page. + </p></dd> +<dt><span class="term">Postconditions:</span></dt> +<dd><p> + <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span> + <span class="identifier">get_stack_size</span><span class="special">()</span></code> + returns the chosen stack size. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + Nothing. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="thread.thread_management.thread.attributes.get_stack_size"></a><a class="link" href="thread_management.html#thread.thread_management.thread.attributes.get_stack_size" title="Member function get_stack_size()">Member + function <code class="computeroutput"><span class="identifier">get_stack_size</span><span class="special">()</span></code></a> +</h5></div></div></div> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">get_stack_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Returns:</span></dt> +<dd><p> + The stack size to be used on the creation of a thread. Note that + this function can return 0 meaning the default. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + Nothing. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="thread.thread_management.thread.attributes.nativehandle"></a><a class="link" href="thread_management.html#thread.thread_management.thread.attributes.nativehandle" title="Member function native_handle()">Member + function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a> +</h5></div></div></div> +<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span> + <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span> + <span class="identifier">native_handle_type</span><span class="special">*</span> <span class="identifier">native_handle</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">const</span> <span class="identifier">native_handle_type</span><span class="special">*</span> <span class="identifier">native_handle</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">noexcept</span><span class="special">;</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Effects:</span></dt> +<dd><p> + Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code> + that can be used with platform-specific APIs to manipulate the + underlying thread attributes implementation. If no such instance + exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">native_handle_type</span></code> + are not present and <code class="computeroutput"><span class="identifier">BOOST_THREAD_DEFINES_THREAD_ATTRIBUTES_NATIVE_HANDLE</span></code> + is not defined. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + Nothing. + </p></dd> +</dl> +</div> +</div> +</div> </div> <div class="section"> <div class="titlepage"><div><div><h3 class="title"> @@ -1263,22 +1908,52 @@ <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.get_id">Non-member function <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.interruption_point">Non-member - function <code class="computeroutput"><span class="identifier">interruption_point</span><span class="special">()</span></code></a></span></dt> + function <code class="computeroutput"><span class="identifier">interruption_point</span><span class="special">()</span></code> EXTENSION</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.interruption_requested">Non-member - function <code class="computeroutput"><span class="identifier">interruption_requested</span><span class="special">()</span></code></a></span></dt> + function <code class="computeroutput"><span class="identifier">interruption_requested</span><span class="special">()</span></code> EXTENSION</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.interruption_enabled">Non-member - function <code class="computeroutput"><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a></span></dt> + function <code class="computeroutput"><span class="identifier">interruption_enabled</span><span class="special">()</span></code> EXTENSION</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.sleep">Non-member function <code class="computeroutput"><span class="identifier">sleep</span><span class="special">()</span></code></a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.sleep_until">Non-member + function <code class="computeroutput"><span class="identifier">sleep_until</span><span class="special">()</span></code></a></span></dt> +<dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.sleep_for">Non-member + function <code class="computeroutput"><span class="identifier">sleep_for</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.yield">Non-member function <code class="computeroutput"><span class="identifier">yield</span><span class="special">()</span></code></a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.disable_interruption">Class - <code class="computeroutput"><span class="identifier">disable_interruption</span></code></a></span></dt> + <code class="computeroutput"><span class="identifier">disable_interruption</span></code> EXTENSION</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.restore_interruption">Class - <code class="computeroutput"><span class="identifier">restore_interruption</span></code></a></span></dt> + <code class="computeroutput"><span class="identifier">restore_interruption</span></code> EXTENSION</a></span></dt> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.atthreadexit">Non-member - function template <code class="computeroutput"><span class="identifier">at_thread_exit</span><span class="special">()</span></code></a></span></dt> + function template <code class="computeroutput"><span class="identifier">at_thread_exit</span><span class="special">()</span></code> EXTENSION</a></span></dt> </dl></div> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> + <span class="keyword">namespace</span> <span class="identifier">this_thread</span> <span class="special">{</span> + <span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">yield</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">sleep_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">sleep_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span> + + <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Callable</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">at_thread_exit</span><span class="special">(</span><span class="identifier">Callable</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span> + + <span class="keyword">void</span> <span class="identifier">interruption_point</span><span class="special">();</span> <span class="comment">// EXTENSION</span> + <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + <span class="keyword">bool</span> <span class="identifier">interruption_enabled</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + <span class="keyword">class</span> <span class="identifier">disable_interruption</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + <span class="keyword">class</span> <span class="identifier">restore_interruption</span><span class="special">;</span> <span class="comment">// EXTENSION</span> + + <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span> + <span class="keyword">void</span> <span class="identifier">sleep</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span> + <span class="keyword">void</span> <span class="identifier">sleep</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">)</span> + <span class="preprocessor">#endif</span> + <span class="special">}</span> +<span class="special">}</span> +</pre> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> <a name="thread.thread_management.this_thread.get_id"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.get_id" title="Non-member function get_id()">Non-member @@ -1288,7 +1963,7 @@ <span class="keyword">namespace</span> <span class="identifier">this_thread</span> <span class="special">{</span> - <span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">();</span> + <span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="special">}</span> </pre> <div class="variablelist"> @@ -1309,8 +1984,8 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.this_thread.interruption_point"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_point" title="Non-member function interruption_point()">Non-member - function <code class="computeroutput"><span class="identifier">interruption_point</span><span class="special">()</span></code></a> +<a name="thread.thread_management.this_thread.interruption_point"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_point" title="Non-member function interruption_point() EXTENSION">Non-member + function <code class="computeroutput"><span class="identifier">interruption_point</span><span class="special">()</span></code> EXTENSION</a> </h4></div></div></div> <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> @@ -1328,8 +2003,8 @@ </p></dd> <dt><span class="term">Throws:</span></dt> <dd><p> - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> - and <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_requested" title="Non-member function interruption_requested()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_requested</span><span class="special">()</span></code></a> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> + and <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_requested" title="Non-member function interruption_requested() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_requested</span><span class="special">()</span></code></a> both return <code class="computeroutput"><span class="keyword">true</span></code>. </p></dd> </dl> @@ -1337,14 +2012,14 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.this_thread.interruption_requested"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_requested" title="Non-member function interruption_requested()">Non-member - function <code class="computeroutput"><span class="identifier">interruption_requested</span><span class="special">()</span></code></a> +<a name="thread.thread_management.this_thread.interruption_requested"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_requested" title="Non-member function interruption_requested() EXTENSION">Non-member + function <code class="computeroutput"><span class="identifier">interruption_requested</span><span class="special">()</span></code> EXTENSION</a> </h4></div></div></div> <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="keyword">namespace</span> <span class="identifier">this_thread</span> <span class="special">{</span> - <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">();</span> + <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="special">}</span> </pre> <div class="variablelist"> @@ -1365,14 +2040,14 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.this_thread.interruption_enabled"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()">Non-member - function <code class="computeroutput"><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> +<a name="thread.thread_management.this_thread.interruption_enabled"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION">Non-member + function <code class="computeroutput"><span class="identifier">interruption_enabled</span><span class="special">()</span></code> EXTENSION</a> </h4></div></div></div> <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="keyword">namespace</span> <span class="identifier">this_thread</span> <span class="special">{</span> - <span class="keyword">bool</span> <span class="identifier">interruption_enabled</span><span class="special">();</span> + <span class="keyword">bool</span> <span class="identifier">interruption_enabled</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="special">}</span> </pre> <div class="variablelist"> @@ -1425,6 +2100,84 @@ is one of the predefined <a class="link" href="thread_management.html#interruption_points"><span class="emphasis"><em>interruption points</em></span></a>. </p></dd> +<dt><span class="term">See:</span></dt> +<dd><p> + Use <code class="computeroutput"><a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_for" title="Non-member function sleep_for()"><code class="computeroutput"><span class="identifier">sleep_for</span></code></a><span class="special">()</span></code> + and <code class="computeroutput"><a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_until" title="Non-member function sleep_until()"><code class="computeroutput"><span class="identifier">sleep_until</span></code></a><span class="special">()</span></code> + instead. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.this_thread.sleep_until"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_until" title="Non-member function sleep_until()">Non-member + function <code class="computeroutput"><span class="identifier">sleep_until</span><span class="special">()</span></code></a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> + +<span class="keyword">namespace</span> <span class="identifier">this_thread</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">sleep_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">>&</span> <span class="identifier">abs_time</span><span class="special">);</span> +<span class="special">}</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Effects:</span></dt> +<dd><p> + Suspends the current thread until the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> has elapsed or the time + point specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> + has been reached. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + Nothing if Clock satisfies the TrivialClock requirements and operations + of Duration do not throw exceptions. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> + if the current thread of execution is interrupted. + </p></dd> +<dt><span class="term">Notes:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">sleep_until</span><span class="special">()</span></code> + is one of the predefined <a class="link" href="thread_management.html#interruption_points"><span class="emphasis"><em>interruption + points</em></span></a>. + </p></dd> +</dl> +</div> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="thread.thread_management.this_thread.sleep_for"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.sleep_for" title="Non-member function sleep_for()">Non-member + function <code class="computeroutput"><span class="identifier">sleep_for</span><span class="special">()</span></code></a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> + +<span class="keyword">namespace</span> <span class="identifier">this_thread</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Period</span><span class="special">></span> + <span class="keyword">void</span> <span class="identifier">sleep_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special"><</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">>&</span> <span class="identifier">rel_time</span><span class="special">);</span> +<span class="special">}</span> +</pre> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term">Effects:</span></dt> +<dd><p> + Suspends the current thread until the time point specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> has been reached. + </p></dd> +<dt><span class="term">Throws:</span></dt> +<dd><p> + Nothing if operations of chrono::duration<Rep, Period> do not + throw exceptions. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> + if the current thread of execution is interrupted. + </p></dd> +<dt><span class="term">Notes:</span></dt> +<dd><p> + <code class="computeroutput"><span class="identifier">sleep_for</span><span class="special">()</span></code> + is one of the predefined <a class="link" href="thread_management.html#interruption_points"><span class="emphasis"><em>interruption + points</em></span></a>. + </p></dd> </dl> </div> </div> @@ -1437,7 +2190,7 @@ <span class="keyword">namespace</span> <span class="identifier">this_thread</span> <span class="special">{</span> - <span class="keyword">void</span> <span class="identifier">yield</span><span class="special">();</span> + <span class="keyword">void</span> <span class="identifier">yield</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="special">}</span> </pre> <div class="variablelist"> @@ -1457,8 +2210,8 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.this_thread.disable_interruption"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption">Class - <code class="computeroutput"><span class="identifier">disable_interruption</span></code></a> +<a name="thread.thread_management.this_thread.disable_interruption"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption EXTENSION">Class + <code class="computeroutput"><span class="identifier">disable_interruption</span></code> EXTENSION</a> </h4></div></div></div> <div class="toc"><dl> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.disable_interruption.constructor">Constructor</a></span></dt> @@ -1471,8 +2224,10 @@ <span class="keyword">class</span> <span class="identifier">disable_interruption</span> <span class="special">{</span> <span class="keyword">public</span><span class="special">:</span> - <span class="identifier">disable_interruption</span><span class="special">();</span> - <span class="special">~</span><span class="identifier">disable_interruption</span><span class="special">();</span> + <span class="identifier">disable_interruption</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">disable_interruption</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> + <span class="identifier">disable_interruption</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">disable_interruption</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> + <span class="identifier">disable_interruption</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="special">~</span><span class="identifier">disable_interruption</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="special">};</span> <span class="special">}</span> </pre> @@ -1486,19 +2241,19 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.this_thread.disable_interruption.constructor"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption.constructor" title="Constructor">Constructor</a> </h5></div></div></div> -<pre class="programlisting"><span class="identifier">disable_interruption</span><span class="special">();</span> +<pre class="programlisting"><span class="identifier">disable_interruption</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> <dl> <dt><span class="term">Effects:</span></dt> <dd><p> - Stores the current state of <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> + Stores the current state of <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> and disables interruption for the current thread. </p></dd> <dt><span class="term">Postconditions:</span></dt> <dd><p> - <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> + <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> returns <code class="computeroutput"><span class="keyword">false</span></code> for the current thread. </p></dd> @@ -1513,7 +2268,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.this_thread.disable_interruption.destructor"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption.destructor" title="Destructor">Destructor</a> </h5></div></div></div> -<pre class="programlisting"><span class="special">~</span><span class="identifier">disable_interruption</span><span class="special">();</span> +<pre class="programlisting"><span class="special">~</span><span class="identifier">disable_interruption</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1524,12 +2279,12 @@ </p></dd> <dt><span class="term">Effects:</span></dt> <dd><p> - Restores the current state of <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> + Restores the current state of <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> for the current thread to that prior to the construction of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. </p></dd> <dt><span class="term">Postconditions:</span></dt> <dd><p> - <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> + <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> for the current thread returns the value stored in the constructor of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. </p></dd> @@ -1543,8 +2298,8 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.this_thread.restore_interruption"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.restore_interruption" title="Class restore_interruption">Class - <code class="computeroutput"><span class="identifier">restore_interruption</span></code></a> +<a name="thread.thread_management.this_thread.restore_interruption"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.restore_interruption" title="Class restore_interruption EXTENSION">Class + <code class="computeroutput"><span class="identifier">restore_interruption</span></code> EXTENSION</a> </h4></div></div></div> <div class="toc"><dl> <dt><span class="section"><a href="thread_management.html#thread.thread_management.this_thread.restore_interruption.constructor">Constructor</a></span></dt> @@ -1557,15 +2312,17 @@ <span class="keyword">class</span> <span class="identifier">restore_interruption</span> <span class="special">{</span> <span class="keyword">public</span><span class="special">:</span> - <span class="keyword">explicit</span> <span class="identifier">restore_interruption</span><span class="special">(</span><span class="identifier">disable_interruption</span><span class="special">&</span> <span class="identifier">disabler</span><span class="special">);</span> - <span class="special">~</span><span class="identifier">restore_interruption</span><span class="special">();</span> + <span class="identifier">restore_interruption</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">restore_interruption</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> + <span class="identifier">restore_interruption</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">restore_interruption</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> + <span class="keyword">explicit</span> <span class="identifier">restore_interruption</span><span class="special">(</span><span class="identifier">disable_interruption</span><span class="special">&</span> <span class="identifier">disabler</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> + <span class="special">~</span><span class="identifier">restore_interruption</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> <span class="special">};</span> <span class="special">}</span> </pre> <p> On construction of an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">restore_interruption</span></code>, the interruption state for the current thread is restored to the interruption - state stored by the constructor of the supplied instance of <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a>. When the + state stored by the constructor of the supplied instance of <a class="link" href="thread_management.html#thread.thread_management.this_thread.disable_interruption" title="Class disable_interruption EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">disable_interruption</span></code></a>. When the instance is destroyed, interruption is again disabled. Instances of <code class="computeroutput"><span class="identifier">restore_interruption</span></code> cannot be copied or moved. </p> @@ -1573,7 +2330,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.this_thread.restore_interruption.constructor"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.restore_interruption.constructor" title="Constructor">Constructor</a> </h5></div></div></div> -<pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">restore_interruption</span><span class="special">(</span><span class="identifier">disable_interruption</span><span class="special">&</span> <span class="identifier">disabler</span><span class="special">);</span> +<pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">restore_interruption</span><span class="special">(</span><span class="identifier">disable_interruption</span><span class="special">&</span> <span class="identifier">disabler</span><span class="special">)</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1585,12 +2342,12 @@ </p></dd> <dt><span class="term">Effects:</span></dt> <dd><p> - Restores the current state of <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> + Restores the current state of <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> for the current thread to that prior to the construction of <code class="computeroutput"><span class="identifier">disabler</span></code>. </p></dd> <dt><span class="term">Postconditions:</span></dt> <dd><p> - <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> + <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> for the current thread returns the value stored in the constructor of <code class="computeroutput"><span class="identifier">disabler</span></code>. </p></dd> @@ -1605,7 +2362,7 @@ <div class="titlepage"><div><div><h5 class="title"> <a name="thread.thread_management.this_thread.restore_interruption.destructor"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.restore_interruption.destructor" title="Destructor">Destructor</a> </h5></div></div></div> -<pre class="programlisting"><span class="special">~</span><span class="identifier">restore_interruption</span><span class="special">();</span> +<pre class="programlisting"><span class="special">~</span><span class="identifier">restore_interruption</span><span class="special">()</span> <span class="identifier">noexcept</span><span class="special">;</span> </pre> <div class="variablelist"> <p class="title"><b></b></p> @@ -1620,7 +2377,7 @@ </p></dd> <dt><span class="term">Postconditions:</span></dt> <dd><p> - <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> + <a class="link" href="thread_management.html#thread.thread_management.this_thread.interruption_enabled" title="Non-member function interruption_enabled() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">interruption_enabled</span><span class="special">()</span></code></a> for the current thread returns <code class="computeroutput"><span class="keyword">false</span></code>. </p></dd> <dt><span class="term">Throws:</span></dt> @@ -1633,8 +2390,8 @@ </div> <div class="section"> <div class="titlepage"><div><div><h4 class="title"> -<a name="thread.thread_management.this_thread.atthreadexit"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.atthreadexit" title="Non-member function template at_thread_exit()">Non-member - function template <code class="computeroutput"><span class="identifier">at_thread_exit</span><span class="special">()</span></code></a> +<a name="thread.thread_management.this_thread.atthreadexit"></a><a class="link" href="thread_management.html#thread.thread_management.this_thread.atthreadexit" title="Non-member function template at_thread_exit() EXTENSION">Non-member + function template <code class="computeroutput"><span class="identifier">at_thread_exit</span><span class="special">()</span></code> EXTENSION</a> </h4></div></div></div> <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> @@ -1908,7 +2665,7 @@ </div> <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> <td align="left"></td> -<td align="right"><div class="copyright-footer">Copyright © 2007 -8 Anthony Williams<p> +<td align="right"><div class="copyright-footer">Copyright © 2007 -11 Anthony Williams<br>Copyright © 2011 -12 Vicente J. Botet Escriba<p> Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) </p> |