1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Scoped Threads</title> 6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../thread.html" title="Chapter 39. Thread 4.8.0"> 10<link rel="prev" href="thread_management.html" title="Thread Management"> 11<link rel="next" href="synchronization.html" title="Synchronization"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="thread_management.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="synchronization.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="thread.ScopedThreads"></a><a class="link" href="ScopedThreads.html" title="Scoped Threads">Scoped Threads</a> 29</h2></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.motivation">Motivation</a></span></dt> 32<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.tutorial">Tutorial</a></span></dt> 33<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.thread_functors">Free Thread Functors</a></span></dt> 34<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.strict_scoped_thread">Class <code class="computeroutput"><span class="identifier">strict_scoped_thread</span></code></a></span></dt> 35<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread">Class <code class="computeroutput"><span class="identifier">scoped_thread</span></code></a></span></dt> 36<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.non_member_swap">Non-member function 37 <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">scoped_thread</span><span class="special">&,</span><span class="identifier">scoped_thread</span><span class="special">&)</span></code></a></span></dt> 38</dl></div> 39<h4> 40<a name="thread.ScopedThreads.h0"></a> 41 <span class="phrase"><a name="thread.ScopedThreads.synopsis"></a></span><a class="link" href="ScopedThreads.html#thread.ScopedThreads.synopsis">Synopsis</a> 42 </h4> 43<pre class="programlisting"><span class="comment">//#include <boost/thread/scoped_thread.hpp></span> 44 45<span class="keyword">struct</span> <span class="identifier">detach</span><span class="special">;</span> 46<span class="keyword">struct</span> <span class="identifier">join_if_joinable</span><span class="special">;</span> 47<span class="keyword">struct</span> <span class="identifier">interrupt_and_join_if_joinable</span><span class="special">;</span> 48<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CallableThread</span> <span class="special">=</span> <span class="identifier">join_if_joinable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Thread</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">></span> 49<span class="keyword">class</span> <span class="identifier">strict_scoped_thread</span><span class="special">;</span> 50<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CallableThread</span> <span class="special">=</span> <span class="identifier">join_if_joinable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Thread</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">></span> 51<span class="keyword">class</span> <span class="identifier">scoped_thread</span><span class="special">;</span> 52<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CallableThread</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Thread</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">></span> 53<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">scoped_thread</span><span class="special"><</span><span class="identifier">Callable</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">scoped_threadCallable</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">noexcept</span><span class="special">;</span> 54</pre> 55<div class="section"> 56<div class="titlepage"><div><div><h3 class="title"> 57<a name="thread.ScopedThreads.motivation"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.motivation" title="Motivation">Motivation</a> 58</h3></div></div></div> 59<p> 60 Based on the scoped_thread class defined in C++ Concurrency in Action Boost.Thread 61 defines a thread wrapper class that instead of calling terminate if the thread 62 is joinable on destruction, call a specific action given as template parameter. 63 </p> 64<p> 65 While the scoped_thread class defined in C++ Concurrency in Action is closer 66 to strict_scoped_thread class that doesn't allows any change in the wrapped 67 thread, Boost.Thread provides a class scoped_thread that provides the same 68 non-deprecated interface as <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a>. 69 </p> 70</div> 71<div class="section"> 72<div class="titlepage"><div><div><h3 class="title"> 73<a name="thread.ScopedThreads.tutorial"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.tutorial" title="Tutorial">Tutorial</a> 74</h3></div></div></div> 75<p> 76 Scoped Threads are wrappers around a thread that allows the user to state 77 what to do at destruction time. One of the common uses is to join the thread 78 at destruction time so this is the default behavior. This is the single difference 79 respect to a thread. While thread call std::terminate() on the destructor 80 if the thread is joinable, strict_scoped_thread<> or scoped_thread<> 81 join the thread if joinable. 82 </p> 83<p> 84 The difference between strict_scoped_thread and scoped_thread is that the 85 strict_scoped_thread hides completely the owned thread and so the user can 86 do nothing with the owned thread other than the specific action given as 87 parameter, while scoped_thread provide the same interface as <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> and forwards all the operations. 88 </p> 89<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">strict_scoped_thread</span><span class="special"><></span> <span class="identifier">t1</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">f</span><span class="special">)));</span> 90<span class="comment">//t1.detach(); // compile fails</span> 91<span class="identifier">boost</span><span class="special">::</span><span class="identifier">scoped_thread</span><span class="special"><></span> <span class="identifier">t2</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">f</span><span class="special">)));</span> 92<span class="identifier">t2</span><span class="special">.</span><span class="identifier">detach</span><span class="special">();</span> 93</pre> 94</div> 95<div class="section"> 96<div class="titlepage"><div><div><h3 class="title"> 97<a name="thread.ScopedThreads.thread_functors"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.thread_functors" title="Free Thread Functors">Free Thread Functors</a> 98</h3></div></div></div> 99<div class="toc"><dl class="toc"> 100<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.thread_functors.detach">Functor 101 <code class="computeroutput"><span class="identifier">detach</span></code></a></span></dt> 102<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.thread_functors.join_if_joinable">Functor 103 <code class="computeroutput"><span class="identifier">join_if_joinable</span></code></a></span></dt> 104<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.thread_functors.interrupt_and_join_if_joinable">Functor 105 <code class="computeroutput"><span class="identifier">interrupt_and_join_if_joinable</span></code></a></span></dt> 106</dl></div> 107<pre class="programlisting"><span class="comment">//#include <boost/thread/scoped_thread.hpp></span> 108 109<span class="keyword">struct</span> <span class="identifier">detach</span><span class="special">;</span> 110<span class="keyword">struct</span> <span class="identifier">join_if_joinable</span><span class="special">;</span> 111<span class="keyword">struct</span> <span class="identifier">interrupt_and_join_if_joinable</span><span class="special">;</span> 112</pre> 113<div class="section"> 114<div class="titlepage"><div><div><h4 class="title"> 115<a name="thread.ScopedThreads.thread_functors.detach"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.thread_functors.detach" title="Functor detach">Functor 116 <code class="computeroutput"><span class="identifier">detach</span></code></a> 117</h4></div></div></div> 118<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">detach</span> 119<span class="special">{</span> 120 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Thread</span><span class="special">></span> 121 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Thread</span><span class="special">&</span> <span class="identifier">t</span><span class="special">)</span> 122 <span class="special">{</span> 123 <span class="identifier">t</span><span class="special">.</span><span class="identifier">detach</span><span class="special">();</span> 124 <span class="special">}</span> 125<span class="special">};</span> 126</pre> 127</div> 128<div class="section"> 129<div class="titlepage"><div><div><h4 class="title"> 130<a name="thread.ScopedThreads.thread_functors.join_if_joinable"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.thread_functors.join_if_joinable" title="Functor join_if_joinable">Functor 131 <code class="computeroutput"><span class="identifier">join_if_joinable</span></code></a> 132</h4></div></div></div> 133<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">join_if_joinable</span> 134<span class="special">{</span> 135 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Thread</span><span class="special">></span> 136 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Thread</span><span class="special">&</span> <span class="identifier">t</span><span class="special">)</span> 137 <span class="special">{</span> 138 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span><span class="special">.</span><span class="identifier">joinable</span><span class="special">())</span> 139 <span class="special">{</span> 140 <span class="identifier">t</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> 141 <span class="special">}</span> 142 <span class="special">}</span> 143<span class="special">};</span> 144</pre> 145</div> 146<div class="section"> 147<div class="titlepage"><div><div><h4 class="title"> 148<a name="thread.ScopedThreads.thread_functors.interrupt_and_join_if_joinable"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.thread_functors.interrupt_and_join_if_joinable" title="Functor interrupt_and_join_if_joinable">Functor 149 <code class="computeroutput"><span class="identifier">interrupt_and_join_if_joinable</span></code></a> 150</h4></div></div></div> 151<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">interrupt_and_join_if_joinable</span> 152<span class="special">{</span> 153 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Thread</span><span class="special">></span> 154 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Thread</span><span class="special">&</span> <span class="identifier">t</span><span class="special">)</span> 155 <span class="special">{</span> 156 <span class="identifier">t</span><span class="special">.</span><span class="identifier">interrupt</span><span class="special">();</span> 157 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">t</span><span class="special">.</span><span class="identifier">joinable</span><span class="special">())</span> 158 <span class="special">{</span> 159 <span class="identifier">t</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> 160 <span class="special">}</span> 161 <span class="special">}</span> 162<span class="special">};</span> 163</pre> 164</div> 165</div> 166<div class="section"> 167<div class="titlepage"><div><div><h3 class="title"> 168<a name="thread.ScopedThreads.strict_scoped_thread"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.strict_scoped_thread" title="Class strict_scoped_thread">Class <code class="computeroutput"><span class="identifier">strict_scoped_thread</span></code></a> 169</h3></div></div></div> 170<div class="toc"><dl class="toc"> 171<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.strict_scoped_thread.default_constructor">Constructor from a <code class="computeroutput"><span class="identifier">thread</span></code></a></span></dt> 172<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.strict_scoped_thread.call_constructor">Move 173 Constructor from a Callable</a></span></dt> 174<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.strict_scoped_thread.destructor">Destructor</a></span></dt> 175</dl></div> 176<pre class="programlisting"><span class="comment">// #include <boost/thread/scoped_thread.hpp></span> 177 178<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CallableThread</span> <span class="special">=</span> <span class="identifier">join_if_joinable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Thread</span> <span class="special">=</span> <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span><span class="special">></span> 179<span class="keyword">class</span> <span class="identifier">strict_scoped_thread</span> 180<span class="special">{</span> 181 <span class="identifier">thread</span> <span class="identifier">t_</span><span class="special">;</span> <span class="comment">// for exposition purposes only</span> 182<span class="keyword">public</span><span class="special">:</span> 183 184 <span class="identifier">strict_scoped_thread</span><span class="special">(</span><span class="identifier">strict_scoped_thread</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 185 <span class="identifier">strict_scoped_thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_scoped_thread</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 186 187 <span class="keyword">explicit</span> <span class="identifier">strict_scoped_thread</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">noexcept</span><span class="special">;</span> 188 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&&,</span> <span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">></span> 189 <span class="keyword">explicit</span> <span class="identifier">strict_scoped_thread</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&,</span> <span class="identifier">Args</span><span class="special">&&...);</span> 190 191 <span class="special">~</span><span class="identifier">strict_scoped_thread</span><span class="special">();</span> 192 193<span class="special">};</span> 194</pre> 195<p> 196 RAII <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> 197 wrapper adding a specific destroyer allowing to master what can be done at 198 destruction time. 199 </p> 200<p> 201 CallableThread: A callable <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&)</span></code>. 202 </p> 203<p> 204 The default is a <code class="computeroutput"><span class="identifier">join_if_joinable</span></code>. 205 </p> 206<p> 207 Thread destructor terminates the program if the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> is joinable. This wrapper 208 can be used to join the thread before destroying it. 209 </p> 210<h5> 211<a name="thread.ScopedThreads.strict_scoped_thread.h0"></a> 212 <span class="phrase"><a name="thread.ScopedThreads.strict_scoped_thread.example"></a></span><a class="link" href="ScopedThreads.html#thread.ScopedThreads.strict_scoped_thread.example">Example</a> 213 </h5> 214<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">strict_scoped_thread</span><span class="special"><></span> <span class="identifier">t</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">F</span><span class="special">)));</span> 215</pre> 216<div class="section"> 217<div class="titlepage"><div><div><h4 class="title"> 218<a name="thread.ScopedThreads.strict_scoped_thread.default_constructor"></a>Constructor from a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> 219</h4></div></div></div> 220<pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">strict_scoped_thread</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">noexcept</span><span class="special">;</span> 221</pre> 222<div class="variablelist"> 223<p class="title"><b></b></p> 224<dl class="variablelist"> 225<dt><span class="term">Effects:</span></dt> 226<dd><p> 227 move the thread to own <code class="computeroutput"><span class="identifier">t_</span></code> 228 </p></dd> 229<dt><span class="term">Throws:</span></dt> 230<dd><p> 231 Nothing 232 </p></dd> 233</dl> 234</div> 235</div> 236<div class="section"> 237<div class="titlepage"><div><div><h4 class="title"> 238<a name="thread.ScopedThreads.strict_scoped_thread.call_constructor"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.strict_scoped_thread.call_constructor" title="Move Constructor from a Callable">Move 239 Constructor from a Callable</a> 240</h4></div></div></div> 241<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&&,</span> <span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">></span> 242<span class="keyword">explicit</span> <span class="identifier">strict_scoped_thread</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&,</span> <span class="identifier">Args</span><span class="special">&&...);</span> 243</pre> 244<div class="variablelist"> 245<p class="title"><b></b></p> 246<dl class="variablelist"> 247<dt><span class="term">Effects:</span></dt> 248<dd><p> 249 Construct an internal thread in place. 250 </p></dd> 251<dt><span class="term">Postconditions:</span></dt> 252<dd><p> 253 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span><span class="special">.</span><span class="identifier">t_</span></code> 254 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>. 255 </p></dd> 256<dt><span class="term">Throws:</span></dt> 257<dd><p> 258 Any exception the thread construction can throw. 259 </p></dd> 260</dl> 261</div> 262</div> 263<div class="section"> 264<div class="titlepage"><div><div><h4 class="title"> 265<a name="thread.ScopedThreads.strict_scoped_thread.destructor"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.strict_scoped_thread.destructor" title="Destructor">Destructor</a> 266</h4></div></div></div> 267<pre class="programlisting"><span class="special">~</span><span class="identifier">strict_scoped_thread</span><span class="special">();</span> 268</pre> 269<div class="variablelist"> 270<p class="title"><b></b></p> 271<dl class="variablelist"> 272<dt><span class="term">Effects:</span></dt> 273<dd><p> 274 Equivalent to <code class="computeroutput"><span class="identifier">CallableThread</span><span class="special">()(</span><span class="identifier">t_</span><span class="special">)</span></code>. 275 </p></dd> 276<dt><span class="term">Throws:</span></dt> 277<dd><p> 278 Nothing: The <code class="computeroutput"><span class="identifier">CallableThread</span><span class="special">()(</span><span class="identifier">t_</span><span class="special">)</span></code> should not throw when joining the 279 thread as the scoped variable is on a scope outside the thread function. 280 </p></dd> 281</dl> 282</div> 283</div> 284</div> 285<div class="section"> 286<div class="titlepage"><div><div><h3 class="title"> 287<a name="thread.ScopedThreads.scoped_thread"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread" title="Class scoped_thread">Class <code class="computeroutput"><span class="identifier">scoped_thread</span></code></a> 288</h3></div></div></div> 289<div class="toc"><dl class="toc"> 290<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.default_constructor">Default 291 Constructor</a></span></dt> 292<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.move_constructor">Move 293 Constructor</a></span></dt> 294<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.move_assignment">Move 295 assignment operator</a></span></dt> 296<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.thread_constructor">Move Constructor from a <code class="computeroutput"><span class="identifier">thread</span></code></a></span></dt> 297<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.call_constructor">Move 298 Constructor from a Callable</a></span></dt> 299<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.destructor">Destructor</a></span></dt> 300<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.joinable">Member 301 function <code class="computeroutput"><span class="identifier">joinable</span><span class="special">()</span></code></a></span></dt> 302<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.join">Member function 303 <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a></span></dt> 304<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.try_join_for">Member 305 function <code class="computeroutput"><span class="identifier">try_join_for</span><span class="special">()</span></code></a></span></dt> 306<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.try_join_until">Member 307 function <code class="computeroutput"><span class="identifier">try_join_until</span><span class="special">()</span></code></a></span></dt> 308<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.detach">Member function 309 <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code></a></span></dt> 310<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.get_id">Member function 311 <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code></a></span></dt> 312<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.interrupt">Member 313 function <code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a></span></dt> 314<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.hardware_concurrency">Static 315 member function <code class="computeroutput"><span class="identifier">hardware_concurrency</span><span class="special">()</span></code></a></span></dt> 316<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.physical_concurrency">Static 317 member function <code class="computeroutput"><span class="identifier">physical_concurrency</span><span class="special">()</span></code></a></span></dt> 318<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.nativehandle">Member 319 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt> 320<dt><span class="section"><a href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.swap">Member function 321 <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a></span></dt> 322</dl></div> 323<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">scoped_thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 324 325<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CallableThread</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Thread</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">></span> 326<span class="keyword">class</span> <span class="identifier">scoped_thread</span> 327<span class="special">{</span> 328 <span class="identifier">thread</span> <span class="identifier">t_</span><span class="special">;</span> <span class="comment">// for exposition purposes only</span> 329<span class="keyword">public</span><span class="special">:</span> 330 <span class="identifier">scoped_thread</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 331 <span class="identifier">scoped_thread</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">scoped_thread</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 332 <span class="identifier">scoped_thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">scoped_thread</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 333 334 <span class="keyword">explicit</span> <span class="identifier">scoped_thread</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&&</span> <span class="identifier">th</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 335 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&&,</span> <span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">></span> 336 <span class="keyword">explicit</span> <span class="identifier">scoped_thread</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&,</span> <span class="identifier">Args</span><span class="special">&&...);</span> 337 338 <span class="special">~</span><span class="identifier">scoped_thread</span><span class="special">();</span> 339 340 <span class="comment">// move support</span> 341 <span class="identifier">scoped_thread</span><span class="special">(</span><span class="identifier">scoped_thread</span> <span class="special">&&</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 342 <span class="identifier">scoped_thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">scoped_thread</span> <span class="special">&&</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 343 344 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">scoped_thread</span><span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 345 346 <span class="keyword">typedef</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">id</span><span class="special">;</span> 347 348 <span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 349 350 <span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 351 <span class="keyword">void</span> <span class="identifier">join</span><span class="special">();</span> 352<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span> 353 <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> 354 <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> 355 <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> 356 <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> 357<span class="preprocessor">#endif</span> 358 359 <span class="keyword">void</span> <span class="identifier">detach</span><span class="special">();</span> 360 361 <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">hardware_concurrency</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 362 <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">physical_concurrency</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 363 364 <span class="keyword">typedef</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">native_handle_type</span> <span class="identifier">native_handle_type</span><span class="special">;</span> 365 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 366 367<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_INTERRUPTIONS</span> 368 <span class="keyword">void</span> <span class="identifier">interrupt</span><span class="special">();</span> 369 <span class="keyword">bool</span> <span class="identifier">interruption_requested</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 370<span class="preprocessor">#endif</span> 371 372 373<span class="special">};</span> 374 375<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CallableThread</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Thread</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">></span> 376<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">scoped_thread</span><span class="special"><</span><span class="identifier">CallableThread</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">scoped_thread</span><span class="special"><</span><span class="identifier">CallableThread</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">noexcept</span><span class="special">;</span> 377</pre> 378<p> 379 RAII <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> 380 wrapper adding a specific destroyer allowing to master what can be done at 381 destruction time. 382 </p> 383<p> 384 CallableThread: A callable void(thread&). The default is join_if_joinable. 385 </p> 386<p> 387 Thread destructor terminates the program if the thread is joinable. This 388 wrapper can be used to join the thread before destroying it. 389 </p> 390<p> 391 Remark: <code class="computeroutput"><span class="identifier">scoped_thread</span></code> is 392 not a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> 393 as <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> 394 is not designed to be derived from as a polymorphic type. 395 </p> 396<p> 397 Anyway <code class="computeroutput"><span class="identifier">scoped_thread</span></code> can 398 be used in most of the contexts a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> could be used as it has the 399 same non-deprecated interface with the exception of the construction. 400 </p> 401<h5> 402<a name="thread.ScopedThreads.scoped_thread.h0"></a> 403 <span class="phrase"><a name="thread.ScopedThreads.scoped_thread.example"></a></span><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.example">Example</a> 404 </h5> 405<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">scoped_thread</span><span class="special"><></span> <span class="identifier">t</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">F</span><span class="special">)));</span> 406<span class="identifier">t</span><span class="special">.</span><span class="identifier">interrupt</span><span class="special">();</span> 407</pre> 408<div class="section"> 409<div class="titlepage"><div><div><h4 class="title"> 410<a name="thread.ScopedThreads.scoped_thread.default_constructor"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.default_constructor" title="Default Constructor">Default 411 Constructor</a> 412</h4></div></div></div> 413<pre class="programlisting"><span class="identifier">scoped_thread</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 414</pre> 415<div class="variablelist"> 416<p class="title"><b></b></p> 417<dl class="variablelist"> 418<dt><span class="term">Effects:</span></dt> 419<dd><p> 420 Constructs a scoped_thread instance that wraps to <span class="emphasis"><em>Not-a-Thread</em></span>. 421 </p></dd> 422<dt><span class="term">Postconditions:</span></dt> 423<dd><p> 424 <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> 425 </p></dd> 426<dt><span class="term">Throws:</span></dt> 427<dd><p> 428 Nothing 429 </p></dd> 430</dl> 431</div> 432</div> 433<div class="section"> 434<div class="titlepage"><div><div><h4 class="title"> 435<a name="thread.ScopedThreads.scoped_thread.move_constructor"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.move_constructor" title="Move Constructor">Move 436 Constructor</a> 437</h4></div></div></div> 438<pre class="programlisting"><span class="identifier">scoped_thread</span><span class="special">(</span><span class="identifier">scoped_thread</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 439</pre> 440<div class="variablelist"> 441<p class="title"><b></b></p> 442<dl class="variablelist"> 443<dt><span class="term">Effects:</span></dt> 444<dd><p> 445 Transfers ownership of the scoped_thread managed by <code class="computeroutput"><span class="identifier">other</span></code> (if any) to the newly constructed 446 scoped_thread instance. 447 </p></dd> 448<dt><span class="term">Postconditions:</span></dt> 449<dd><p> 450 <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> 451 and <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code> 452 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 453 </p></dd> 454<dt><span class="term">Throws:</span></dt> 455<dd><p> 456 Nothing 457 </p></dd> 458</dl> 459</div> 460</div> 461<div class="section"> 462<div class="titlepage"><div><div><h4 class="title"> 463<a name="thread.ScopedThreads.scoped_thread.move_assignment"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.move_assignment" title="Move assignment operator">Move 464 assignment operator</a> 465</h4></div></div></div> 466<pre class="programlisting"><span class="identifier">scoped_thread</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">scoped_thread</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 467</pre> 468<div class="variablelist"> 469<p class="title"><b></b></p> 470<dl class="variablelist"> 471<dt><span class="term">Effects:</span></dt> 472<dd><p> 473 Transfers ownership of the scoped_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> 474 after having called to <code class="computeroutput"><span class="identifier">CallableThread</span><span class="special">()(</span><span class="identifier">t_</span><span class="special">)</span></code>. 475 </p></dd> 476<dt><span class="term">Postconditions:</span></dt> 477<dd><p> 478 <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> 479 and <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code> 480 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. 481 </p></dd> 482<dt><span class="term">Throws:</span></dt> 483<dd><p> 484 Nothing: The <code class="computeroutput"><span class="identifier">CallableThread</span><span class="special">()(</span><span class="identifier">t_</span><span class="special">)</span></code> should not throw when joining the 485 thread as the scoped variable is on a scope outside the thread function. 486 </p></dd> 487</dl> 488</div> 489</div> 490<div class="section"> 491<div class="titlepage"><div><div><h4 class="title"> 492<a name="thread.ScopedThreads.scoped_thread.thread_constructor"></a>Move Constructor from a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> 493</h4></div></div></div> 494<pre class="programlisting"><span class="identifier">scoped_thread</span><span class="special">(</span><span class="identifier">thread</span><span class="special">&&</span> <span class="identifier">t</span><span class="special">);</span> 495</pre> 496<div class="variablelist"> 497<p class="title"><b></b></p> 498<dl class="variablelist"> 499<dt><span class="term">Effects:</span></dt> 500<dd><p> 501 Transfers ownership of the thread managed by <code class="computeroutput"><span class="identifier">other</span></code> 502 (if any) to the newly constructed scoped_thread instance. 503 </p></dd> 504<dt><span class="term">Postconditions:</span></dt> 505<dd><p> 506 other.get_id()==thread::id() and get_id() returns the value of other.get_id() 507 prior to the construction. 508 </p></dd> 509<dt><span class="term">Throws:</span></dt> 510<dd><p> 511 Nothing 512 </p></dd> 513</dl> 514</div> 515</div> 516<div class="section"> 517<div class="titlepage"><div><div><h4 class="title"> 518<a name="thread.ScopedThreads.scoped_thread.call_constructor"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.call_constructor" title="Move Constructor from a Callable">Move 519 Constructor from a Callable</a> 520</h4></div></div></div> 521<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&&,</span> <span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">></span> 522<span class="keyword">explicit</span> <span class="identifier">scoped_thread</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&,</span> <span class="identifier">Args</span><span class="special">&&...);</span> 523</pre> 524<div class="variablelist"> 525<p class="title"><b></b></p> 526<dl class="variablelist"> 527<dt><span class="term">Effects:</span></dt> 528<dd><p> 529 Construct an internal thread in place. 530 </p></dd> 531<dt><span class="term">Postconditions:</span></dt> 532<dd><p> 533 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span><span class="special">.</span><span class="identifier">t_</span></code> 534 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>. 535 </p></dd> 536<dt><span class="term">Throws:</span></dt> 537<dd><p> 538 Any exception the thread construction can throw. 539 </p></dd> 540</dl> 541</div> 542</div> 543<div class="section"> 544<div class="titlepage"><div><div><h4 class="title"> 545<a name="thread.ScopedThreads.scoped_thread.destructor"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.destructor" title="Destructor">Destructor</a> 546</h4></div></div></div> 547<pre class="programlisting"><span class="special">~</span><span class="identifier">scoped_thread</span><span class="special">();</span> 548</pre> 549<div class="variablelist"> 550<p class="title"><b></b></p> 551<dl class="variablelist"> 552<dt><span class="term">Effects:</span></dt> 553<dd><p> 554 Equivalent to <code class="computeroutput"><span class="identifier">CallableThread</span><span class="special">()(</span><span class="identifier">t_</span><span class="special">)</span></code>. 555 </p></dd> 556<dt><span class="term">Throws:</span></dt> 557<dd><p> 558 Nothing: The <code class="computeroutput"><span class="identifier">CallableThread</span><span class="special">()(</span><span class="identifier">t_</span><span class="special">)</span></code> should not throw when joining the 559 thread as the scoped variable is on a scope outside the thread function. 560 </p></dd> 561</dl> 562</div> 563</div> 564<div class="section"> 565<div class="titlepage"><div><div><h4 class="title"> 566<a name="thread.ScopedThreads.scoped_thread.joinable"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.joinable" title="Member function joinable()">Member 567 function <code class="computeroutput"><span class="identifier">joinable</span><span class="special">()</span></code></a> 568</h4></div></div></div> 569<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">joinable</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 570</pre> 571<div class="variablelist"> 572<p class="title"><b></b></p> 573<dl class="variablelist"> 574<dt><span class="term">Returns:</span></dt> 575<dd><p> 576 Equivalent to return t_.joinable(). 577 </p></dd> 578<dt><span class="term">Throws:</span></dt> 579<dd><p> 580 Nothing 581 </p></dd> 582</dl> 583</div> 584</div> 585<div class="section"> 586<div class="titlepage"><div><div><h4 class="title"> 587<a name="thread.ScopedThreads.scoped_thread.join"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.join" title="Member function join()">Member function 588 <code class="computeroutput"><span class="identifier">join</span><span class="special">()</span></code></a> 589</h4></div></div></div> 590<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">join</span><span class="special">();</span> 591</pre> 592<div class="variablelist"> 593<p class="title"><b></b></p> 594<dl class="variablelist"> 595<dt><span class="term">Effects:</span></dt> 596<dd><p> 597 Equivalent to t_.join(). 598 </p></dd> 599</dl> 600</div> 601</div> 602<div class="section"> 603<div class="titlepage"><div><div><h4 class="title"> 604<a name="thread.ScopedThreads.scoped_thread.try_join_for"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.try_join_for" title="Member function try_join_for()">Member 605 function <code class="computeroutput"><span class="identifier">try_join_for</span><span class="special">()</span></code></a> 606</h4></div></div></div> 607<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> 608<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> 609</pre> 610<div class="variablelist"> 611<p class="title"><b></b></p> 612<dl class="variablelist"> 613<dt><span class="term">Effects:</span></dt> 614<dd><p> 615 Equivalent to return <code class="computeroutput"><span class="identifier">t_</span><span class="special">.</span><span class="identifier">try_join_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>. 616 </p></dd> 617</dl> 618</div> 619</div> 620<div class="section"> 621<div class="titlepage"><div><div><h4 class="title"> 622<a name="thread.ScopedThreads.scoped_thread.try_join_until"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.try_join_until" title="Member function try_join_until()">Member 623 function <code class="computeroutput"><span class="identifier">try_join_until</span><span class="special">()</span></code></a> 624</h4></div></div></div> 625<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> 626<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> 627</pre> 628<div class="variablelist"> 629<p class="title"><b></b></p> 630<dl class="variablelist"> 631<dt><span class="term">Effects:</span></dt> 632<dd><p> 633 Equivalent to return <code class="computeroutput"><span class="identifier">t_</span><span class="special">.</span><span class="identifier">try_join_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>. 634 </p></dd> 635</dl> 636</div> 637</div> 638<div class="section"> 639<div class="titlepage"><div><div><h4 class="title"> 640<a name="thread.ScopedThreads.scoped_thread.detach"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.detach" title="Member function detach()">Member function 641 <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code></a> 642</h4></div></div></div> 643<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">detach</span><span class="special">();</span> 644</pre> 645<div class="variablelist"> 646<p class="title"><b></b></p> 647<dl class="variablelist"> 648<dt><span class="term">Effects:</span></dt> 649<dd><p> 650 Equivalent to <code class="computeroutput"><span class="identifier">t_</span><span class="special">.</span><span class="identifier">detach</span><span class="special">()</span></code>. 651 </p></dd> 652</dl> 653</div> 654</div> 655<div class="section"> 656<div class="titlepage"><div><div><h4 class="title"> 657<a name="thread.ScopedThreads.scoped_thread.get_id"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.get_id" title="Member function get_id()">Member function 658 <code class="computeroutput"><span class="identifier">get_id</span><span class="special">()</span></code></a> 659</h4></div></div></div> 660<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="keyword">noexcept</span><span class="special">;</span> 661</pre> 662<div class="variablelist"> 663<p class="title"><b></b></p> 664<dl class="variablelist"> 665<dt><span class="term">Effects:</span></dt> 666<dd><p> 667 Equivalent to return <code class="computeroutput"><span class="identifier">t_</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span></code>. 668 </p></dd> 669</dl> 670</div> 671</div> 672<div class="section"> 673<div class="titlepage"><div><div><h4 class="title"> 674<a name="thread.ScopedThreads.scoped_thread.interrupt"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.interrupt" title="Member function interrupt()">Member 675 function <code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 676</h4></div></div></div> 677<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">interrupt</span><span class="special">();</span> 678</pre> 679<div class="variablelist"> 680<p class="title"><b></b></p> 681<dl class="variablelist"> 682<dt><span class="term">Effects:</span></dt> 683<dd><p> 684 Equivalent to <code class="computeroutput"><span class="identifier">t_</span><span class="special">.</span><span class="identifier">interrupt</span><span class="special">()</span></code>. 685 </p></dd> 686</dl> 687</div> 688</div> 689<div class="section"> 690<div class="titlepage"><div><div><h4 class="title"> 691<a name="thread.ScopedThreads.scoped_thread.hardware_concurrency"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.hardware_concurrency" title="Static member function hardware_concurrency()">Static 692 member function <code class="computeroutput"><span class="identifier">hardware_concurrency</span><span class="special">()</span></code></a> 693</h4></div></div></div> 694<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> 695</pre> 696<div class="variablelist"> 697<p class="title"><b></b></p> 698<dl class="variablelist"> 699<dt><span class="term">Effects:</span></dt> 700<dd><p> 701 Equivalent to return <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">hardware_concurrency</span><span class="special">()</span></code>. 702 </p></dd> 703</dl> 704</div> 705</div> 706<div class="section"> 707<div class="titlepage"><div><div><h4 class="title"> 708<a name="thread.ScopedThreads.scoped_thread.physical_concurrency"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.physical_concurrency" title="Static member function physical_concurrency()">Static 709 member function <code class="computeroutput"><span class="identifier">physical_concurrency</span><span class="special">()</span></code></a> 710</h4></div></div></div> 711<pre class="programlisting"><span class="keyword">unsigned</span> <span class="identifier">physical_concurrency</span><span class="special">()</span> <span class="identifier">noexecpt</span><span class="special">;</span> 712</pre> 713<div class="variablelist"> 714<p class="title"><b></b></p> 715<dl class="variablelist"> 716<dt><span class="term">Effects:</span></dt> 717<dd><p> 718 Equivalent to return <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">physical_concurrency</span><span class="special">()</span></code>. 719 </p></dd> 720</dl> 721</div> 722</div> 723<div class="section"> 724<div class="titlepage"><div><div><h4 class="title"> 725<a name="thread.ScopedThreads.scoped_thread.nativehandle"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.nativehandle" title="Member function native_handle()">Member 726 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a> 727</h4></div></div></div> 728<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">native_handle_type</span> <span class="identifier">native_handle_type</span><span class="special">;</span> 729<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 730</pre> 731<div class="variablelist"> 732<p class="title"><b></b></p> 733<dl class="variablelist"> 734<dt><span class="term">Effects:</span></dt> 735<dd><p> 736 Equivalent to return <code class="computeroutput"><span class="identifier">t_</span><span class="special">.</span><span class="identifier">native_handle</span><span class="special">()</span></code>. 737 </p></dd> 738</dl> 739</div> 740</div> 741<div class="section"> 742<div class="titlepage"><div><div><h4 class="title"> 743<a name="thread.ScopedThreads.scoped_thread.swap"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.scoped_thread.swap" title="Member function swap()">Member function 744 <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a> 745</h4></div></div></div> 746<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">scoped_thread</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 747</pre> 748<div class="variablelist"> 749<p class="title"><b></b></p> 750<dl class="variablelist"> 751<dt><span class="term">Effects:</span></dt> 752<dd><p> 753 Equivalent <code class="computeroutput"><span class="identifier">t_</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">t_</span><span class="special">)</span></code>. 754 </p></dd> 755</dl> 756</div> 757</div> 758</div> 759<div class="section"> 760<div class="titlepage"><div><div><h3 class="title"> 761<a name="thread.ScopedThreads.non_member_swap"></a><a class="link" href="ScopedThreads.html#thread.ScopedThreads.non_member_swap" title="Non-member function swap(scoped_thread&,scoped_thread&)">Non-member function 762 <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">scoped_thread</span><span class="special">&,</span><span class="identifier">scoped_thread</span><span class="special">&)</span></code></a> 763</h3></div></div></div> 764<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">scoped_thread</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 765 766<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CallableThread</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Thread</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">></span> 767<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">scoped_thread</span><span class="special"><</span><span class="identifier">Callable</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">scoped_threadCallable</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">noexcept</span><span class="special">;</span> 768</pre> 769<div class="variablelist"> 770<p class="title"><b></b></p> 771<dl class="variablelist"> 772<dt><span class="term">Effects:</span></dt> 773<dd><p> 774 <code class="computeroutput"><span class="identifier">lhs</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">)</span></code>. 775 </p></dd> 776</dl> 777</div> 778</div> 779</div> 780<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 781<td align="left"></td> 782<td align="right"><div class="copyright-footer">Copyright © 2007 -11 Anthony Williams<br>Copyright © 2011 -17 Vicente J. Botet Escriba<p> 783 Distributed under the Boost Software License, Version 1.0. (See accompanying 784 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>) 785 </p> 786</div></td> 787</tr></table> 788<hr> 789<div class="spirit-nav"> 790<a accesskey="p" href="thread_management.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="synchronization.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 791</div> 792</body> 793</html> 794