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>Synchronization</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="ScopedThreads.html" title="Scoped Threads"> 11<link rel="next" href="thread_local_storage.html" title="Thread Local Storage"> 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="ScopedThreads.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="thread_local_storage.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.synchronization"></a><a class="link" href="synchronization.html" title="Synchronization">Synchronization</a> 29</h2></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial">Tutorial</a></span></dt> 32<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts">Mutex Concepts</a></span></dt> 33<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_option">Lock Options</a></span></dt> 34<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard">Lock Guard</a></span></dt> 35<dt><span class="section"><a href="synchronization.html#thread.synchronization.with_lock_guard">With Lock Guard</a></span></dt> 36<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts">Lock Concepts</a></span></dt> 37<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks">Lock Types</a></span></dt> 38<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks">Other Lock Types 39 - EXTENSION</a></span></dt> 40<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions">Lock functions</a></span></dt> 41<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories">Lock Factories 42 - EXTENSION</a></span></dt> 43<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types">Mutex Types</a></span></dt> 44<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref">Condition Variables</a></span></dt> 45<dt><span class="section"><a href="synchronization.html#thread.synchronization.once">One-time Initialization</a></span></dt> 46<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers">Barriers -- EXTENSION</a></span></dt> 47<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches">Latches -- EXPERIMENTAL</a></span></dt> 48<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors">Executors and Schedulers 49 -- EXPERIMENTAL</a></span></dt> 50<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures">Futures</a></span></dt> 51</dl></div> 52<div class="section"> 53<div class="titlepage"><div><div><h3 class="title"> 54<a name="thread.synchronization.tutorial"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial" title="Tutorial">Tutorial</a> 55</h3></div></div></div> 56<div class="toc"><dl class="toc"> 57<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking">Internal 58 Locking</a></span></dt> 59<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes">External 60 Locking -- <code class="computeroutput"><span class="identifier">strict_lock</span></code> and 61 <code class="computeroutput"><span class="identifier">externally_locked</span></code> classes</a></span></dt> 62<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.with">Executing Around 63 a Function</a></span></dt> 64</dl></div> 65<p> 66 <a href="http://web.archive.org/web/20140531071228/http://home.roadrunner.com/~hinnant/mutexes/locking.html" target="_top">Handling 67 mutexes in C++</a> is an excellent tutorial. You need just replace std 68 and ting by boost. 69 </p> 70<p> 71 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html" target="_top">Mutex, 72 Lock, Condition Variable Rationale</a> adds rationale for the design 73 decisions made for mutexes, locks and condition variables. 74 </p> 75<p> 76 In addition to the C++11 standard locks, Boost.Thread provides other locks 77 and some utilities that help the user to make their code thread-safe. 78 </p> 79<div class="section"> 80<div class="titlepage"><div><div><h4 class="title"> 81<a name="thread.synchronization.tutorial.internal_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking" title="Internal Locking">Internal 82 Locking</a> 83</h4></div></div></div> 84<div class="toc"><dl class="toc"> 85<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution">Concurrent 86 threads of execution</a></span></dt> 87<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_locking">Internal 88 locking</a></span></dt> 89<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_and_external_locking">Internal 90 and external locking</a></span></dt> 91</dl></div> 92<div class="note"><table border="0" summary="Note"> 93<tr> 94<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 95<th align="left">Note</th> 96</tr> 97<tr><td align="left" valign="top"><p> 98 This tutorial is an adaptation of chapter Concurrency of the Object-Oriented 99 Programming in the BETA Programming Language and of the paper of Andrei 100 Alexandrescu "Multithreading and the C++ Type System" to the 101 Boost library. 102 </p></td></tr> 103</table></div> 104<div class="section"> 105<div class="titlepage"><div><div><h5 class="title"> 106<a name="thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution" title="Concurrent threads of execution">Concurrent 107 threads of execution</a> 108</h5></div></div></div> 109<p> 110 Consider, for example, modeling a bank account class that supports simultaneous 111 deposits and withdrawals from multiple locations (arguably the "Hello, 112 World" of multithreaded programming). 113 </p> 114<p> 115 From here a component is a model of the <code class="computeroutput"><span class="identifier">Callable</span></code> 116 concept. 117 </p> 118<p> 119 I C++11 (Boost) concurrent execution of a component is obtained by means 120 of the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">thread</span></code>(<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code>): 121 </p> 122<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread1</span><span class="special">(</span><span class="identifier">S</span><span class="special">);</span> 123</pre> 124<p> 125 where <code class="computeroutput"><span class="identifier">S</span></code> is a model of 126 <code class="computeroutput"><span class="identifier">Callable</span></code>. The meaning 127 of this expression is that execution of <code class="computeroutput"><span class="identifier">S</span><span class="special">()</span></code> will take place concurrently with the 128 current thread of execution executing the expression. 129 </p> 130<p> 131 The following example includes a bank account of a person (Joe) and two 132 components, one corresponding to a bank agent depositing money in Joe's 133 account, and one representing Joe. Joe will only be withdrawing money 134 from the account: 135 </p> 136<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span><span class="special">;</span> 137 138<span class="identifier">BankAccount</span> <span class="identifier">JoesAccount</span><span class="special">;</span> 139 140<span class="keyword">void</span> <span class="identifier">bankAgent</span><span class="special">()</span> 141<span class="special">{</span> 142 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span><span class="number">10</span><span class="special">;</span> <span class="identifier">i</span><span class="special">></span><span class="number">0</span><span class="special">;</span> <span class="special">--</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 143 <span class="comment">//...</span> 144 <span class="identifier">JoesAccount</span><span class="special">.</span><span class="identifier">Deposit</span><span class="special">(</span><span class="number">500</span><span class="special">);</span> 145 <span class="comment">//...</span> 146 <span class="special">}</span> 147<span class="special">}</span> 148 149<span class="keyword">void</span> <span class="identifier">Joe</span><span class="special">()</span> <span class="special">{</span> 150 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span><span class="number">10</span><span class="special">;</span> <span class="identifier">i</span><span class="special">></span><span class="number">0</span><span class="special">;</span> <span class="special">--</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 151 <span class="comment">//...</span> 152 <span class="keyword">int</span> <span class="identifier">myPocket</span> <span class="special">=</span> <span class="identifier">JoesAccount</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">100</span><span class="special">);</span> 153 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">myPocket</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 154 <span class="comment">//...</span> 155 <span class="special">}</span> 156<span class="special">}</span> 157 158<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 159 <span class="comment">//...</span> 160 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread1</span><span class="special">(</span><span class="identifier">bankAgent</span><span class="special">);</span> <span class="comment">// start concurrent execution of bankAgent</span> 161 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread2</span><span class="special">(</span><span class="identifier">Joe</span><span class="special">);</span> <span class="comment">// start concurrent execution of Joe</span> 162 <span class="identifier">thread1</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> 163 <span class="identifier">thread2</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span> 164 <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> 165<span class="special">}</span> 166</pre> 167<p> 168 From time to time, the <code class="computeroutput"><span class="identifier">bankAgent</span></code> 169 will deposit $500 in <code class="computeroutput"><span class="identifier">JoesAccount</span></code>. 170 <code class="computeroutput"><span class="identifier">Joe</span></code> will similarly withdraw 171 $100 from his account. These sentences describe that the <code class="computeroutput"><span class="identifier">bankAgent</span></code> and <code class="computeroutput"><span class="identifier">Joe</span></code> 172 are executed concurrently. 173 </p> 174</div> 175<div class="section"> 176<div class="titlepage"><div><div><h5 class="title"> 177<a name="thread.synchronization.tutorial.internal_locking.internal_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_locking" title="Internal locking">Internal 178 locking</a> 179</h5></div></div></div> 180<p> 181 The above example works well as long as the components <code class="computeroutput"><span class="identifier">bankAgent</span></code> and <code class="computeroutput"><span class="identifier">Joe</span></code> 182 doesn't access <code class="computeroutput"><span class="identifier">JoesAccount</span></code> 183 at the same time. There is, however, no guarantee that this will not 184 happen. We may use a mutex to guarantee exclusive access to each bank. 185 </p> 186<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span> 187 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span> 188 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span> 189<span class="keyword">public</span><span class="special">:</span> 190 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 191 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> 192 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span> 193 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> 194 <span class="special">}</span> 195 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 196 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> 197 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span> 198 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> 199 <span class="special">}</span> 200 <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span> 201 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> 202 <span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">balance_</span><span class="special">;</span> 203 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> 204 <span class="keyword">return</span> <span class="identifier">b</span><span class="special">;</span> 205 <span class="special">}</span> 206<span class="special">};</span> 207</pre> 208<p> 209 Execution of the <code class="computeroutput"><span class="identifier">Deposit</span></code> 210 and <code class="computeroutput"><span class="identifier">Withdraw</span></code> operations 211 will no longer be able to make simultaneous access to balance. 212 </p> 213<p> 214 A mutex is a simple and basic mechanism for obtaining synchronization. 215 In the above example it is relatively easy to be convinced that the synchronization 216 works correctly (in the absence of exception). In a system with several 217 concurrent objects and several shared objects, it may be difficult to 218 describe synchronization by means of mutexes. Programs that make heavy 219 use of mutexes may be difficult to read and write. Instead, we shall 220 introduce a number of generic classes for handling more complicated forms 221 of synchronization and communication. 222 </p> 223<p> 224 With the RAII idiom we can simplify a lot this using the scoped locks. 225 In the code below, guard's constructor locks the passed-in object <code class="computeroutput"><span class="identifier">mtx_</span></code>, and guard's destructor unlocks 226 <code class="computeroutput"><span class="identifier">mtx_</span></code>. 227 </p> 228<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span> 229 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span> <span class="comment">// explicit mutex declaration </span> 230 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span> 231<span class="keyword">public</span><span class="special">:</span> 232 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 233 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span> 234 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span> 235 <span class="special">}</span> 236 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 237 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span> 238 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span> 239 <span class="special">}</span> 240 <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span> 241 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span> 242 <span class="keyword">return</span> <span class="identifier">balance_</span><span class="special">;</span> 243 <span class="special">}</span> 244<span class="special">};</span> 245</pre> 246<p> 247 The object-level locking idiom doesn't cover the entire richness of a 248 threading model. For example, the model above is quite deadlock-prone 249 when you try to coordinate multi-object transactions. Nonetheless, object-level 250 locking is useful in many cases, and in combination with other mechanisms 251 can provide a satisfactory solution to many threaded access problems 252 in object-oriented programs. 253 </p> 254</div> 255<div class="section"> 256<div class="titlepage"><div><div><h5 class="title"> 257<a name="thread.synchronization.tutorial.internal_locking.internal_and_external_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_and_external_locking" title="Internal and external locking">Internal 258 and external locking</a> 259</h5></div></div></div> 260<p> 261 The BankAccount class above uses internal locking. Basically, a class 262 that uses internal locking guarantees that any concurrent calls to its 263 public member functions don't corrupt an instance of that class. This 264 is typically ensured by having each public member function acquire a 265 lock on the object upon entry. This way, for any given object of that 266 class, there can be only one member function call active at any moment, 267 so the operations are nicely serialized. 268 </p> 269<p> 270 This approach is reasonably easy to implement and has an attractive simplicity. 271 Unfortunately, "simple" might sometimes morph into "simplistic." 272 </p> 273<p> 274 Internal locking is insufficient for many real-world synchronization 275 tasks. Imagine that you want to implement an ATM withdrawal transaction 276 with the BankAccount class. The requirements are simple. The ATM transaction 277 consists of two withdrawals-one for the actual money and one for the 278 $2 commission. The two withdrawals must appear in strict sequence; that 279 is, no other transaction can exist between them. 280 </p> 281<p> 282 The obvious implementation is erratic: 283 </p> 284<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span> 285 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span> 286 <span class="comment">// preemption possible</span> 287 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> 288<span class="special">}</span> 289</pre> 290<p> 291 The problem is that between the two calls above, another thread can perform 292 another operation on the account, thus breaking the second design requirement. 293 </p> 294<p> 295 In an attempt to solve this problem, let's lock the account from the 296 outside during the two operations: 297 </p> 298<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span> 299 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">acct</span><span class="special">.</span><span class="identifier">mtx_</span><span class="special">);</span> <span class="number">1</span> 300 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span> 301 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> 302<span class="special">}</span> 303</pre> 304<p> 305 Notice that the code above doesn't compile, the <code class="computeroutput"><span class="identifier">mtx_</span></code> 306 field is private. We have two possibilities: 307 </p> 308<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 309<li class="listitem"> 310 make <code class="computeroutput"><span class="identifier">mtx_</span></code> public 311 which seems odd 312 </li> 313<li class="listitem"> 314 make the <code class="computeroutput"><span class="identifier">BankAccount</span></code> 315 lockable by adding the lock/unlock functions 316 </li> 317</ul></div> 318<p> 319 We can add these functions explicitly 320 </p> 321<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span> 322 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span> 323 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span> 324<span class="keyword">public</span><span class="special">:</span> 325 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 326 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span> 327 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span> 328 <span class="special">}</span> 329 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 330 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span> 331 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span> 332 <span class="special">}</span> 333 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">()</span> <span class="special">{</span> 334 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> 335 <span class="special">}</span> 336 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">()</span> <span class="special">{</span> 337 <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> 338 <span class="special">}</span> 339<span class="special">};</span> 340</pre> 341<p> 342 or inheriting from a class which add these lockable functions. 343 </p> 344<p> 345 The <code class="computeroutput"><span class="identifier">basic_lockable_adapter</span></code> 346 class helps to define the <code class="computeroutput"><span class="identifier">BankAccount</span></code> 347 class as 348 </p> 349<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> 350<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">></span> 351<span class="special">{</span> 352 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span> 353<span class="keyword">public</span><span class="special">:</span> 354 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 355 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> 356 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span> 357 <span class="special">}</span> 358 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 359 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> 360 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span> 361 <span class="special">}</span> 362 <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span> 363 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> 364 <span class="keyword">return</span> <span class="identifier">balance_</span><span class="special">;</span> 365 <span class="special">}</span> 366<span class="special">};</span> 367</pre> 368<p> 369 and the code that doesn't compiles becomes 370 </p> 371<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span> 372 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">acct</span><span class="special">);</span> 373 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span> 374 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> 375<span class="special">}</span> 376</pre> 377<p> 378 Notice that now acct is being locked by Withdraw after it has already 379 been locked by guard. When running such code, one of two things happens. 380 </p> 381<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 382<li class="listitem"> 383 Your mutex implementation might support the so-called recursive mutex 384 semantics. This means that the same thread can lock the same mutex 385 several times successfully. In this case, the implementation works 386 but has a performance overhead due to unnecessary locking. (The locking/unlocking 387 sequence in the two Withdraw calls is not needed but performed anyway-and 388 that costs time.) 389 </li> 390<li class="listitem"> 391 Your mutex implementation might not support recursive locking, which 392 means that as soon as you try to acquire it the second time, it blocks-so 393 the ATMWithdrawal function enters the dreaded deadlock. 394 </li> 395</ul></div> 396<p> 397 As <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code> is not recursive, we need to 398 use its recursive version <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code>. 399 </p> 400<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> 401<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">recursive_mutex</span><span class="special">></span> 402<span class="special">{</span> 403 404 <span class="comment">// ...</span> 405<span class="special">};</span> 406</pre> 407<p> 408 The caller-ensured locking approach is more flexible and the most efficient, 409 but very dangerous. In an implementation using caller-ensured locking, 410 BankAccount still holds a mutex, but its member functions don't manipulate 411 it at all. Deposit and Withdraw are not thread-safe anymore. Instead, 412 the client code is responsible for locking BankAccount properly. 413 </p> 414<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> 415 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">mutex</span><span class="special">></span> <span class="special">{</span> 416 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span> 417<span class="keyword">public</span><span class="special">:</span> 418 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 419 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span> 420 <span class="special">}</span> 421 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 422 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span> 423 <span class="special">}</span> 424<span class="special">};</span> 425</pre> 426<p> 427 Obviously, the caller-ensured locking approach has a safety problem. 428 BankAccount's implementation code is finite, and easy to reach and maintain, 429 but there's an unbounded amount of client code that manipulates BankAccount 430 objects. In designing applications, it's important to differentiate between 431 requirements imposed on bounded code and unbounded code. If your class 432 makes undue requirements on unbounded code, that's usually a sign that 433 encapsulation is out the window. 434 </p> 435<p> 436 To conclude, if in designing a multi-threaded class you settle on internal 437 locking, you expose yourself to inefficiency or deadlocks. On the other 438 hand, if you rely on caller-provided locking, you make your class error-prone 439 and difficult to use. Finally, external locking completely avoids the 440 issue by leaving it all to the client code. 441 </p> 442</div> 443</div> 444<div class="section"> 445<div class="titlepage"><div><div><h4 class="title"> 446<a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes" title="External Locking -- strict_lock and externally_locked classes">External 447 Locking -- <code class="computeroutput"><span class="identifier">strict_lock</span></code> and 448 <code class="computeroutput"><span class="identifier">externally_locked</span></code> classes</a> 449</h4></div></div></div> 450<div class="toc"><dl class="toc"> 451<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits">Locks 452 as permits</a></span></dt> 453<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking">Improving 454 External Locking</a></span></dt> 455<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks">Allowing 456 other strict locks</a></span></dt> 457</dl></div> 458<div class="note"><table border="0" summary="Note"> 459<tr> 460<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 461<th align="left">Note</th> 462</tr> 463<tr><td align="left" valign="top"><p> 464 This tutorial is an adaptation of the paper by Andrei Alexandrescu "Multithreading 465 and the C++ Type System" to the Boost library. 466 </p></td></tr> 467</table></div> 468<div class="section"> 469<div class="titlepage"><div><div><h5 class="title"> 470<a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits" title="Locks as permits">Locks 471 as permits</a> 472</h5></div></div></div> 473<p> 474 So what to do? Ideally, the BankAccount class should do the following: 475 </p> 476<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 477<li class="listitem"> 478 Support both locking models (internal and external). 479 </li> 480<li class="listitem"> 481 Be efficient; that is, use no unnecessary locking. 482 </li> 483<li class="listitem"> 484 Be safe; that is, BankAccount objects cannot be manipulated without 485 appropriate locking. 486 </li> 487</ul></div> 488<p> 489 Let's make a worthwhile observation: Whenever you lock a BankAccount, 490 you do so by using a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> object. Turning this statement around, 491 wherever there's a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>, there's also a locked <code class="computeroutput"><span class="identifier">BankAccount</span></code> somewhere. Thus, you can 492 think of-and use-a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> object as a permit. Owning a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> 493 gives you rights to do certain things. The <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> object should not be copied or aliased 494 (it's not a transmissible permit). 495 </p> 496<div class="orderedlist"><ol class="orderedlist" type="1"> 497<li class="listitem"> 498 As long as a permit is still alive, the <code class="computeroutput"><span class="identifier">BankAccount</span></code> 499 object stays locked. 500 </li> 501<li class="listitem"> 502 When the <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> is destroyed, the <code class="computeroutput"><span class="identifier">BankAccount</span></code>'s mutex is released. 503 </li> 504</ol></div> 505<p> 506 The net effect is that at any point in your code, having access to a 507 <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> 508 object guarantees that a <code class="computeroutput"><span class="identifier">BankAccount</span></code> 509 is locked. (You don't know exactly which <code class="computeroutput"><span class="identifier">BankAccount</span></code> 510 is locked, however-an issue that we'll address soon.) 511 </p> 512<p> 513 For now, let's make a couple of enhancements to the <code class="computeroutput"><span class="identifier">lock_guard</span></code> 514 class template defined in Boost.Thread. We'll call the enhanced version 515 <code class="computeroutput"><span class="identifier">strict_lock</span></code>. Essentially, 516 a <code class="computeroutput"><span class="identifier">strict_lock</span></code>'s role 517 is only to live on the stack as an automatic variable. <code class="computeroutput"><span class="identifier">strict_lock</span></code> must adhere to a non-copy 518 and non-alias policy. <code class="computeroutput"><span class="identifier">strict_lock</span></code> 519 disables copying by making the copy constructor and the assignment operator 520 private. 521 </p> 522<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 523<span class="keyword">class</span> <span class="identifier">strict_lock</span> <span class="special">{</span> 524<span class="keyword">public</span><span class="special">:</span> 525 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">lockable_type</span><span class="special">;</span> 526 527 528 <span class="keyword">explicit</span> <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">lockable_type</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">obj_</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span> <span class="special">{</span> 529 <span class="identifier">obj</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> <span class="comment">// locks on construction</span> 530 <span class="special">}</span> 531 <span class="identifier">strict_lock</span><span class="special">()</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 532 <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 533 <span class="identifier">strict_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 534 535 <span class="special">~</span><span class="identifier">strict_lock</span><span class="special">()</span> <span class="special">{</span> <span class="identifier">obj_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> <span class="special">}</span> <span class="comment">// unlocks on destruction </span> 536 537 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="comment">// strict lockers specific function </span> 538 <span class="special">{</span> 539 <span class="keyword">return</span> <span class="identifier">l</span> <span class="special">==</span> <span class="special">&</span><span class="identifier">obj_</span><span class="special">;</span> 540 <span class="special">}</span> 541<span class="keyword">private</span><span class="special">:</span> 542 <span class="identifier">lockable_type</span><span class="special">&</span> <span class="identifier">obj_</span><span class="special">;</span> 543<span class="special">};</span> 544</pre> 545<p> 546 Silence can be sometimes louder than words-what's forbidden to do with 547 a <code class="computeroutput"><span class="identifier">strict_lock</span></code> is as important 548 as what you can do. Let's see what you can and what you cannot do with 549 a <code class="computeroutput"><span class="identifier">strict_lock</span></code> instantiation: 550 </p> 551<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 552 You can create a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> only starting from a valid T 553 object. Notice that there is no other way you can create a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>. 554 </li></ul></div> 555<pre class="programlisting"><span class="identifier">BankAccount</span> <span class="identifier">myAccount</span><span class="special">(</span><span class="string">"John Doe"</span><span class="special">,</span> <span class="string">"123-45-6789"</span><span class="special">);</span> 556<span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">myLock</span><span class="special">(</span><span class="identifier">myAccount</span><span class="special">);</span> <span class="comment">// ok</span> 557</pre> 558<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 559 You cannot copy <code class="computeroutput"><span class="identifier">strict_lock</span></code>s 560 to one another. In particular, you cannot pass <code class="computeroutput"><span class="identifier">strict_lock</span></code>s 561 by value to functions or have them returned by functions: 562 </li></ul></div> 563<pre class="programlisting"><span class="keyword">extern</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">Foo</span><span class="special">();</span> <span class="comment">// compile-time error</span> 564<span class="keyword">extern</span> <span class="keyword">void</span> <span class="identifier">Bar</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>);</span> <span class="comment">// compile-time error</span> 565</pre> 566<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 567 However, you still can pass <code class="computeroutput"><span class="identifier">strict_lock</span></code>s 568 by reference to and from functions: 569 </li></ul></div> 570<pre class="programlisting"><span class="comment">// ok, Foo returns a reference to strict_lock<BankAccount></span> 571<span class="keyword">extern</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&</span> <span class="identifier">Foo</span><span class="special">();</span> 572<span class="comment">// ok, Bar takes a reference to strict_lock<BankAccount></span> 573<span class="keyword">extern</span> <span class="keyword">void</span> <span class="identifier">Bar</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&);</span> 574</pre> 575<p> 576 All these rules were put in place with one purpose-enforcing that owning 577 a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> 578 is a reasonably strong guarantee that 579 </p> 580<div class="orderedlist"><ol class="orderedlist" type="1"> 581<li class="listitem"> 582 you locked a T object, and 583 </li> 584<li class="listitem"> 585 that object will be unlocked at a later point. 586 </li> 587</ol></div> 588<p> 589 Now that we have such a strict <code class="computeroutput"><span class="identifier">strict_lock</span></code>, 590 how do we harness its power in defining a safe, flexible interface for 591 BankAccount? The idea is as follows: 592 </p> 593<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 594<li class="listitem"> 595 Each of BankAccount's interface functions (in our case, Deposit and 596 Withdraw) comes in two overloaded variants. 597 </li> 598<li class="listitem"> 599 One version keeps the same signature as before, and the other takes 600 an additional argument of type <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code>. The first version is internally 601 locked; the second one requires external locking. External locking 602 is enforced at compile time by requiring client code to create a 603 <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> 604 object. 605 </li> 606<li class="listitem"> 607 BankAccount avoids code bloating by having the internal locked functions 608 forward to the external locked functions, which do the actual job. 609 </li> 610</ul></div> 611<p> 612 A little code is worth 1,000 words, a (hacked into) saying goes, so here's 613 the new BankAccount class: 614 </p> 615<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> 616<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> 617<span class="special">{</span> 618 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span> 619<span class="keyword">public</span><span class="special">:</span> 620 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span> <span class="special">{</span> 621 <span class="comment">// Externally locked</span> 622 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span> 623 <span class="special">}</span> 624 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 625 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> <span class="comment">// Internally locked</span> 626 <span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span> 627 <span class="special">}</span> 628 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span> <span class="special">{</span> 629 <span class="comment">// Externally locked</span> 630 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span> 631 <span class="special">}</span> 632 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 633 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> <span class="comment">// Internally locked</span> 634 <span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span> 635 <span class="special">}</span> 636<span class="special">};</span> 637</pre> 638<p> 639 Now, if you want the benefit of internal locking, you simply call <code class="computeroutput"><span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code> and 640 <code class="computeroutput"><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>. 641 If you want to use external locking, you lock the object by constructing 642 a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> 643 and then you call <code class="computeroutput"><span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> 644 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span></code> 645 and <code class="computeroutput"><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span></code>. 646 For example, here's the <code class="computeroutput"><span class="identifier">ATMWithdrawal</span></code> 647 function implemented correctly: 648 </p> 649<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span> 650 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">acct</span><span class="special">);</span> 651 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span> 652 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span> 653<span class="special">}</span> 654</pre> 655<p> 656 This function has the best of both worlds-it's reasonably safe and efficient 657 at the same time. 658 </p> 659<p> 660 It's worth noting that <code class="computeroutput"><span class="identifier">strict_lock</span></code> 661 being a template gives extra safety compared to a straight polymorphic 662 approach. In such a design, BankAccount would derive from a Lockable 663 interface. <code class="computeroutput"><span class="identifier">strict_lock</span></code> 664 would manipulate Lockable references so there's no need for templates. 665 This approach is sound; however, it provides fewer compile-time guarantees. 666 Having a <code class="computeroutput"><span class="identifier">strict_lock</span></code> 667 object would only tell that some object derived from Lockable is currently 668 locked. In the templated approach, having a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> gives a stronger guarantee-it's a 669 <code class="computeroutput"><span class="identifier">BankAccount</span></code> that stays 670 locked. 671 </p> 672<p> 673 There's a weasel word in there-I mentioned that ATMWithdrawal is reasonably 674 safe. It's not really safe because there's no enforcement that the <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span></code> 675 object locks the appropriate BankAccount object. The type system only 676 ensures that some BankAccount object is locked. For example, consider 677 the following phony implementation of ATMWithdrawal: 678 </p> 679<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&</span> <span class="identifier">acct</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">)</span> <span class="special">{</span> 680 <span class="identifier">BankAccount</span> <span class="identifier">fakeAcct</span><span class="special">(</span><span class="string">"John Doe"</span><span class="special">,</span> <span class="string">"123-45-6789"</span><span class="special">);</span> 681 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">fakeAcct</span><span class="special">);</span> 682 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span> 683 <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span> 684<span class="special">}</span> 685</pre> 686<p> 687 This code compiles warning-free but obviously doesn't do the right thing-it 688 locks one account and uses another. 689 </p> 690<p> 691 It's important to understand what can be enforced within the realm of 692 the C++ type system and what needs to be enforced at runtime. The mechanism 693 we've put in place so far ensures that some BankAccount object is locked 694 during the call to <code class="computeroutput"><span class="identifier">BankAccount</span><span class="special">::</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> 695 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&)</span></code>. 696 We must enforce at runtime exactly what object is locked. 697 </p> 698<p> 699 If our scheme still needs runtime checks, how is it useful? An unwary 700 or malicious programmer can easily lock the wrong object and manipulate 701 any BankAccount without actually locking it. 702 </p> 703<p> 704 First, let's get the malice issue out of the way. C is a language that 705 requires a lot of attention and discipline from the programmer. C++ made 706 some progress by asking a little less of those, while still fundamentally 707 trusting the programmer. These languages are not concerned with malice 708 (as Java is, for example). After all, you can break any C/C++ design 709 simply by using casts "appropriately" (if appropriately is 710 an, er, appropriate word in this context). 711 </p> 712<p> 713 The scheme is useful because the likelihood of a programmer forgetting 714 about any locking whatsoever is much greater than the likelihood of a 715 programmer who does remember about locking, but locks the wrong object. 716 </p> 717<p> 718 Using <code class="computeroutput"><span class="identifier">strict_lock</span></code> permits 719 compile-time checking of the most common source of errors, and runtime 720 checking of the less frequent problem. 721 </p> 722<p> 723 Let's see how to enforce that the appropriate BankAccount object is locked. 724 First, we need to add a member function to the <code class="computeroutput"><span class="identifier">strict_lock</span></code> 725 class template. The <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">*)</span></code> 726 function returns a reference to the locked object. 727 </p> 728<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">></span> <span class="keyword">class</span> <span class="identifier">strict_lock</span> <span class="special">{</span> 729 <span class="special">...</span> <span class="identifier">as</span> <span class="identifier">before</span> <span class="special">...</span> 730<span class="keyword">public</span><span class="special">:</span> 731 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mtx</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">mtx</span><span class="special">==&</span><span class="identifier">obj_</span><span class="special">;</span> <span class="special">}</span> 732<span class="special">};</span> 733</pre> 734<p> 735 Second, BankAccount needs to use this function compare the locked object 736 against this: 737 </p> 738<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span> 739<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> 740 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span> 741<span class="keyword">public</span><span class="special">:</span> 742 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">>&</span> <span class="identifier">guard</span><span class="special">)</span> <span class="special">{</span> 743 <span class="comment">// Externally locked</span> 744 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">guard</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span> 745 <span class="keyword">throw</span> <span class="string">"Locking Error: Wrong Object Locked"</span><span class="special">;</span> 746 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span> 747 <span class="special">}</span> 748<span class="comment">// ...</span> 749<span class="special">};</span> 750</pre> 751<p> 752 The overhead incurred by the test above is much lower than locking a 753 recursive mutex for the second time. 754 </p> 755</div> 756<div class="section"> 757<div class="titlepage"><div><div><h5 class="title"> 758<a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking" title="Improving External Locking">Improving 759 External Locking</a> 760</h5></div></div></div> 761<p> 762 Now let's assume that BankAccount doesn't use its own locking at all, 763 and has only a thread-neutral implementation: 764 </p> 765<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span> 766 <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span> 767<span class="keyword">public</span><span class="special">:</span> 768 <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 769 <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span> 770 <span class="special">}</span> 771 <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 772 <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span> 773 <span class="special">}</span> 774<span class="special">};</span> 775</pre> 776<p> 777 Now you can use BankAccount in single-threaded and multi-threaded applications 778 alike, but you need to provide your own synchronization in the latter 779 case. 780 </p> 781<p> 782 Say we have an AccountManager class that holds and manipulates a BankAccount 783 object: 784 </p> 785<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">AccountManager</span> 786<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> 787<span class="special">{</span> 788 <span class="identifier">BankAccount</span> <span class="identifier">checkingAcct_</span><span class="special">;</span> 789 <span class="identifier">BankAccount</span> <span class="identifier">savingsAcct_</span><span class="special">;</span> 790 <span class="special">...</span> 791<span class="special">};</span> 792</pre> 793<p> 794 Let's also assume that, by design, AccountManager must stay locked while 795 accessing its BankAccount members. The question is, how can we express 796 this design constraint using the C++ type system? How can we state "You 797 have access to this BankAccount object only after locking its parent 798 AccountManager object"? 799 </p> 800<p> 801 The solution is to use a little bridge template <code class="computeroutput"><span class="identifier">externally_locked</span></code> 802 that controls access to a BankAccount. 803 </p> 804<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 805<span class="keyword">class</span> <span class="identifier">externally_locked</span> <span class="special">{</span> 806 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">LockableConcept</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>));</span> 807 808<span class="keyword">public</span><span class="special">:</span> 809 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">,</span> <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">lockable</span><span class="special">)</span> 810 <span class="special">:</span> <span class="identifier">obj_</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span> 811 <span class="special">,</span> <span class="identifier">lockable_</span><span class="special">(</span><span class="identifier">lockable</span><span class="special">)</span> 812 <span class="special">{}</span> 813 814 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">lockable</span><span class="special">)</span> 815 <span class="special">:</span> <span class="identifier">obj_</span><span class="special">()</span> 816 <span class="special">,</span> <span class="identifier">lockable_</span><span class="special">(</span><span class="identifier">lockable</span><span class="special">)</span> 817 <span class="special">{}</span> 818 819 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">)</span> <span class="special">{</span> 820 821<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span> 822 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(&</span><span class="identifier">lockable_</span><span class="special">))</span> <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span> <span class="comment">//run time check throw if not locks the same</span> 823<span class="preprocessor">#endif</span> 824 <span class="keyword">return</span> <span class="identifier">obj_</span><span class="special">;</span> 825 <span class="special">}</span> 826 <span class="keyword">void</span> <span class="identifier">set</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">,</span> <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">lockable</span><span class="special">)</span> <span class="special">{</span> 827 <span class="identifier">obj_</span> <span class="special">=</span> <span class="identifier">obj</span><span class="special">;</span> 828 <span class="identifier">lockable_</span><span class="special">=</span><span class="identifier">lockable</span><span class="special">;</span> 829 <span class="special">}</span> 830<span class="keyword">private</span><span class="special">:</span> 831 <span class="identifier">T</span> <span class="identifier">obj_</span><span class="special">;</span> 832 <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">lockable_</span><span class="special">;</span> 833<span class="special">};</span> 834</pre> 835<p> 836 <code class="computeroutput"><span class="identifier">externally_locked</span></code> cloaks 837 an object of type T, and actually provides full access to that object 838 through the get and set member functions, provided you pass a reference 839 to a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Owner</span><span class="special">></span></code> 840 object. 841 </p> 842<p> 843 Instead of making <code class="computeroutput"><span class="identifier">checkingAcct_</span></code> 844 and <code class="computeroutput"><span class="identifier">savingsAcct_</span></code> of type 845 <code class="computeroutput"><span class="identifier">BankAccount</span></code>, <code class="computeroutput"><span class="identifier">AccountManager</span></code> holds objects of type 846 <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">,</span> 847 <span class="identifier">AccountManager</span><span class="special">></span></code>: 848 </p> 849<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">AccountManager</span> 850 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> 851<span class="special">{</span> 852<span class="keyword">public</span><span class="special">:</span> 853 <span class="keyword">typedef</span> <span class="identifier">basic_lockable_adapter</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lockable_base_type</span><span class="special">;</span> 854 <span class="identifier">AccountManager</span><span class="special">()</span> 855 <span class="special">:</span> <span class="identifier">checkingAcct_</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> 856 <span class="special">,</span> <span class="identifier">savingsAcct_</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span> 857 <span class="special">{}</span> 858 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">Checking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">);</span> 859 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">);</span> 860<span class="keyword">private</span><span class="special">:</span> 861 862 <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">,</span> <span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">checkingAcct_</span><span class="special">;</span> 863 <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">BankAccount</span><span class="special">,</span> <span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">savingsAcct_</span><span class="special">;</span> 864<span class="special">};</span> 865</pre> 866<p> 867 The pattern is the same as before - to access the BankAccount object 868 cloaked by <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>, 869 you need to call <code class="computeroutput"><span class="identifier">get</span></code>. 870 To call <code class="computeroutput"><span class="identifier">get</span></code>, you need 871 to pass it a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span></code>. The one thing you have to take care 872 of is to not hold pointers or references you obtained by calling <code class="computeroutput"><span class="identifier">get</span></code>. If you do that, make sure that 873 you don't use them after the strict_lock has been destroyed. That is, 874 if you alias the cloaked objects, you're back from "the compiler 875 takes care of that" mode to "you must pay attention" mode. 876 </p> 877<p> 878 Typically, you use <code class="computeroutput"><span class="identifier">externally_locked</span></code> 879 as shown below. Suppose you want to execute an atomic transfer from your 880 checking account to your savings account: 881 </p> 882<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">Checking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 883 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> 884 <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> 885 <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> 886<span class="special">}</span> 887</pre> 888<p> 889 We achieved two important goals. First, the declaration of <code class="computeroutput"><span class="identifier">checkingAcct_</span></code> and <code class="computeroutput"><span class="identifier">savingsAcct_</span></code> 890 makes it clear to the code reader that that variable is protected by 891 a lock on an AccountManager. Second, the design makes it impossible to 892 manipulate the two accounts without actually locking a BankAccount. 893 <code class="computeroutput"><span class="identifier">externally_locked</span></code> is 894 what could be called active documentation. 895 </p> 896</div> 897<div class="section"> 898<div class="titlepage"><div><div><h5 class="title"> 899<a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks" title="Allowing other strict locks">Allowing 900 other strict locks</a> 901</h5></div></div></div> 902<p> 903 Now imagine that the AccountManager function needs to take a <code class="computeroutput"><span class="identifier">unique_lock</span></code> in order to reduce the 904 critical regions. And at some time it needs to access to the <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>. As <code class="computeroutput"><span class="identifier">unique_lock</span></code> 905 is not a strict lock the following code doesn't compile: 906 </p> 907<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 908 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">defer_lock</span><span class="special">);</span> 909 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span> 910 <span class="identifier">guard</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> 911 <span class="special">}</span> 912 <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> <span class="comment">// COMPILE ERROR</span> 913 <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> <span class="comment">// COMPILE ERROR</span> 914 <span class="identifier">do_something_else</span><span class="special">();</span> 915<span class="special">}</span> 916</pre> 917<p> 918 We need a way to transfer the ownership from the <code class="computeroutput"><span class="identifier">unique_lock</span></code> 919 to a <code class="computeroutput"><span class="identifier">strict_lock</span></code> during 920 the time we are working with <code class="computeroutput"><span class="identifier">savingsAcct_</span></code> 921 and then restore the ownership on <code class="computeroutput"><span class="identifier">unique_lock</span></code>. 922 </p> 923<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 924 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard1</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">defer_lock</span><span class="special">);</span> 925 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span> 926 <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> 927 <span class="special">}</span> 928 <span class="special">{</span> 929 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">guard1</span><span class="special">);</span> 930 <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> 931 <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> 932 <span class="special">}</span> 933 <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> 934<span class="special">}</span> 935</pre> 936<p> 937 In order to make this code compilable we need to store either a Lockable 938 or a <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span></code> 939 reference depending on the constructor. We also need to store which kind 940 of reference we have stored, and in the destructor call either to the 941 Lockable <code class="computeroutput"><span class="identifier">unlock</span></code> or restore 942 the ownership. 943 </p> 944<p> 945 This seems too complicated to me. Another possibility is to define a 946 nested strict lock class. The drawback is that instead of having only 947 one strict lock we have two and we need either to duplicate every function 948 taking a <code class="computeroutput"><span class="identifier">strict_lock</span></code> 949 or make these function templates. The problem with template functions 950 is that we don't profit anymore of the C++ type system. We must add some 951 static metafunction that checks that the Locker parameter is a strict 952 lock. The problem is that we can not really check this or can we?. The 953 <code class="computeroutput"><span class="identifier">is_strict_lock</span></code> metafunction 954 must be specialized by the strict lock developer. We need to believe 955 it "sur parole". The advantage is that now we can manage with 956 more than two strict locks without changing our code. This is really 957 nice. 958 </p> 959<p> 960 Now we need to state that both classes are <code class="computeroutput"><span class="identifier">strict_lock</span></code>s. 961 </p> 962<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Locker</span><span class="special">></span> 963<span class="keyword">struct</span> <span class="identifier">is_strict_lock</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span> <span class="special">{};</span> 964 965<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 966<span class="keyword">struct</span> <span class="identifier">is_strict_lock</span><span class="special"><</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">></span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> <span class="special">{}</span> 967 968<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Locker</span><span class="special">></span> 969<span class="keyword">struct</span> <span class="identifier">is_strict_lock</span><span class="special"><</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">></span> <span class="special">></span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> <span class="special">{}</span> 970</pre> 971<p> 972 Well let me show what this <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code> 973 class looks like and the impacts on the <code class="computeroutput"><span class="identifier">externally_locked</span></code> 974 class and the <code class="computeroutput"><span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedFunction</span></code> 975 function. 976 </p> 977<p> 978 First <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code> 979 class will store on a temporary lock the <code class="computeroutput"><span class="identifier">Locker</span></code>, 980 and transfer the lock ownership on the constructor. On destruction it 981 will restore the ownership. Note the use of <code class="computeroutput"><span class="identifier">lock_traits</span></code> 982 and that the <code class="computeroutput"><span class="identifier">Locker</span></code> needs 983 to have a reference to the mutex otherwise an exception is thrown. 984 </p> 985<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Locker</span> <span class="special">></span> 986<span class="keyword">class</span> <span class="identifier">nested_strict_lock</span> 987 <span class="special">{</span> 988 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">MovableLockerConcept</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>));</span> 989<span class="keyword">public</span><span class="special">:</span> 990 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">lockable_type</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">lockable_type</span><span class="special">;</span> 991 <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">syntactic_lock_traits</span><span class="special"><</span><span class="identifier">lockable_type</span><span class="special">>::</span><span class="identifier">lock_error</span> <span class="identifier">lock_error</span><span class="special">;</span> 992 993 <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Locker</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">)</span> 994 <span class="special">:</span> <span class="identifier">lock_</span><span class="special">(</span><span class="identifier">lock</span><span class="special">)</span> <span class="comment">// Store reference to locker</span> 995 <span class="special">,</span> <span class="identifier">tmp_lock_</span><span class="special">(</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">move</span><span class="special">())</span> <span class="comment">// Move ownership to temporary locker </span> 996 <span class="special">{</span> 997 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span> 998 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()==</span><span class="number">0</span><span class="special">)</span> <span class="special">{</span> 999 <span class="identifier">lock_</span><span class="special">=</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">move</span><span class="special">();</span> <span class="comment">// Rollback for coherency purposes </span> 1000 <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span> 1001 <span class="special">}</span> 1002 <span class="preprocessor">#endif</span> 1003 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">tmp_lock_</span><span class="special">)</span> <span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> <span class="comment">// ensures it is locked </span> 1004 <span class="special">}</span> 1005 <span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="special">{</span> 1006 <span class="identifier">lock_</span><span class="special">=</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">move</span><span class="special">();</span> <span class="comment">// Move ownership to nesting locker </span> 1007 <span class="special">}</span> 1008 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> <span class="special">}</span> 1009 <span class="identifier">lockable_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">();</span> <span class="special">}</span> 1010 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">lockable_type</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">l</span><span class="special">==</span><span class="identifier">mutex</span><span class="special">();</span> <span class="special">}</span> 1011 1012 1013<span class="keyword">private</span><span class="special">:</span> 1014 <span class="identifier">Locker</span><span class="special">&</span> <span class="identifier">lock_</span><span class="special">;</span> 1015 <span class="identifier">Locker</span> <span class="identifier">tmp_lock_</span><span class="special">;</span> 1016<span class="special">};</span> 1017</pre> 1018<p> 1019 The <code class="computeroutput"><span class="identifier">externally_locked</span></code> 1020 get function is now a template function taking a Locker as parameters 1021 instead of a <code class="computeroutput"><span class="identifier">strict_lock</span></code>. 1022 We can add test in debug mode that ensure that the Lockable object is 1023 locked. 1024 </p> 1025<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 1026<span class="keyword">class</span> <span class="identifier">externally_locked</span> <span class="special">{</span> 1027<span class="keyword">public</span><span class="special">:</span> 1028 <span class="comment">// ...</span> 1029 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Locker</span><span class="special">></span> 1030 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Locker</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">)</span> <span class="special">{</span> 1031 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">StrictLockerConcept</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>));</span> 1032 1033 <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_strict_lock</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>::</span><span class="identifier">value</span><span class="special">));</span> <span class="comment">// locker is a strict locker "sur parole" </span> 1034 <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">,</span> 1035 <span class="keyword">typename</span> <span class="identifier">lockable_type</span><span class="special"><</span><span class="identifier">Locker</span><span class="special">>::</span><span class="identifier">type</span><span class="special">>::</span><span class="identifier">value</span><span class="special">));</span> <span class="comment">// that locks the same type </span> 1036<span class="preprocessor">#ifndef</span> <span class="identifier">BOOST_THREAD_EXTERNALLY_LOCKED_DONT_CHECK_OWNERSHIP</span> <span class="comment">// define BOOST_THREAD_EXTERNALLY_LOCKED_NO_CHECK_OWNERSHIP if you don't want to check locker ownership</span> 1037 <span class="keyword">if</span> <span class="special">(!</span> <span class="identifier">lock</span> <span class="special">)</span> <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span> <span class="comment">// run time check throw if no locked </span> 1038<span class="preprocessor">#endif</span> 1039<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span> 1040 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(&</span><span class="identifier">lockable_</span><span class="special">))</span> <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span> 1041<span class="preprocessor">#endif</span> 1042 <span class="keyword">return</span> <span class="identifier">obj_</span><span class="special">;</span> 1043 <span class="special">}</span> 1044<span class="special">};</span> 1045</pre> 1046<p> 1047 The <code class="computeroutput"><span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedFunction</span></code> function needs 1048 only to replace the <code class="computeroutput"><span class="identifier">strict_lock</span></code> 1049 by a <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>. 1050 </p> 1051<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span> 1052 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="identifier">guard1</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> 1053 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span> 1054 <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> 1055 <span class="special">}</span> 1056 <span class="special">{</span> 1057 <span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">AccountManager</span><span class="special">></span> <span class="special">></span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">guard1</span><span class="special">);</span> 1058 <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> 1059 <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> 1060 <span class="special">}</span> 1061 <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> 1062<span class="special">}</span> 1063</pre> 1064</div> 1065</div> 1066<div class="section"> 1067<div class="titlepage"><div><div><h4 class="title"> 1068<a name="thread.synchronization.tutorial.with"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.with" title="Executing Around a Function">Executing Around 1069 a Function</a> 1070</h4></div></div></div> 1071<p> 1072 In particular, the library provides a way to lock around the execution 1073 of a function. 1074 </p> 1075<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span> 1076<span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span> 1077 <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> 1078 <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">,</span> 1079 <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span> 1080<span class="special">)</span> <span class="special">-></span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...))</span> <span class="special">{</span> 1081 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span> 1082 <span class="keyword">return</span> <span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...);</span> 1083<span class="special">}</span> 1084</pre> 1085<p> 1086 that can be used with regular functions: 1087 </p> 1088<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">func</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&);</span> 1089<span class="comment">//...</span> 1090<span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span> 1091<span class="keyword">int</span> <span class="identifier">a</span><span class="special">;</span> 1092<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">func</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">));</span> 1093</pre> 1094<p> 1095 with boost::bind: 1096 </p> 1097<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span> 1098 <span class="identifier">m</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">func</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">))</span> 1099<span class="special">);</span> 1100</pre> 1101<p> 1102 or with lambda expression: 1103 </p> 1104<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span><span class="special">;</span> 1105<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span> 1106 <span class="identifier">m</span><span class="special">,</span> 1107 <span class="special">[&</span><span class="identifier">a</span><span class="special">](</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span> 1108 <span class="comment">// this scope is protected by mutex m</span> 1109 <span class="identifier">a</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span> 1110 <span class="keyword">return</span> <span class="identifier">x</span> <span class="special">+</span> <span class="number">4</span><span class="special">;</span> 1111 <span class="special">},</span> 1112 <span class="number">5</span> 1113<span class="special">);</span> 1114</pre> 1115</div> 1116</div> 1117<div class="section"> 1118<div class="titlepage"><div><div><h3 class="title"> 1119<a name="thread.synchronization.mutex_concepts"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts" title="Mutex Concepts">Mutex Concepts</a> 1120</h3></div></div></div> 1121<div class="toc"><dl class="toc"> 1122<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable"><code class="computeroutput"><span class="identifier">BasicLockable</span></code> Concept</a></span></dt> 1123<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable"><code class="computeroutput"><span class="identifier">Lockable</span></code> Concept</a></span></dt> 1124<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive">Recursive 1125 Lockable Concept</a></span></dt> 1126<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> Concept</a></span></dt> 1127<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> Concept -- C++14</a></span></dt> 1128<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> Concept -- EXTENSION</a></span></dt> 1129</dl></div> 1130<p> 1131 A mutex object facilitates protection against data races and allows thread-safe 1132 synchronization of data between threads. A thread obtains ownership of a 1133 mutex object by calling one of the lock functions and relinquishes ownership 1134 by calling the corresponding unlock function. Mutexes may be either recursive 1135 or non-recursive, and may grant simultaneous ownership to one or many threads. 1136 <span class="bold"><strong>Boost.Thread</strong></span> supplies recursive and non-recursive 1137 mutexes with exclusive ownership semantics, along with a shared ownership 1138 (multiple-reader / single-writer) mutex. 1139 </p> 1140<p> 1141 <span class="bold"><strong>Boost.Thread</strong></span> supports four basic concepts 1142 for lockable objects: <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a>. Each mutex type 1143 implements one or more of these concepts, as do the various lock types. 1144 </p> 1145<div class="section"> 1146<div class="titlepage"><div><div><h4 class="title"> 1147<a name="thread.synchronization.mutex_concepts.basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code> Concept</a> 1148</h4></div></div></div> 1149<div class="toc"><dl class="toc"> 1150<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span></code></a></span></dt> 1151<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span></code></a></span></dt> 1152<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable"><code class="computeroutput"><span class="identifier">is_basic_lockable</span></code> trait -- EXTENSION</a></span></dt> 1153</dl></div> 1154<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span> 1155 1156<span class="keyword">namespace</span> <span class="identifier">boost</span> 1157<span class="special">{</span> 1158 1159 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1160 <span class="keyword">class</span> <span class="identifier">BasicLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 1161<span class="special">}</span> 1162</pre> 1163<p> 1164 The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept models exclusive 1165 ownership. A type <code class="computeroutput"><span class="identifier">L</span></code> meets 1166 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> requirements if 1167 the following expressions are well-formed and have the specified semantics 1168 (<code class="computeroutput"><span class="identifier">m</span></code> denotes a value of type 1169 <code class="computeroutput"><span class="identifier">L</span></code>): 1170 </p> 1171<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1172<li class="listitem"> 1173 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">();</span></code> 1174 </li> 1175<li class="listitem"> 1176 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">();</span></code> 1177 </li> 1178</ul></div> 1179<p> 1180 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 1181 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>. 1182 </p> 1183<div class="section"> 1184<div class="titlepage"><div><div><h5 class="title"> 1185<a name="thread.synchronization.mutex_concepts.basic_lockable.lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span></code></a> 1186</h5></div></div></div> 1187<div class="variablelist"> 1188<p class="title"><b></b></p> 1189<dl class="variablelist"> 1190<dt><span class="term">Requires:</span></dt> 1191<dd><p> 1192 The calling thread doesn't owns the mutex if the mutex is not recursive. 1193 </p></dd> 1194<dt><span class="term">Effects:</span></dt> 1195<dd><p> 1196 The current thread blocks until ownership can be obtained for the 1197 current thread. 1198 </p></dd> 1199<dt><span class="term">Synchronization:</span></dt> 1200<dd><p> 1201 Prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> 1202 operations on the same object synchronizes with this operation. 1203 </p></dd> 1204<dt><span class="term">Postcondition:</span></dt> 1205<dd><p> 1206 The current thread owns <code class="computeroutput"><span class="identifier">m</span></code>. 1207 </p></dd> 1208<dt><span class="term">Return type:</span></dt> 1209<dd><p> 1210 <code class="computeroutput"><span class="keyword">void</span></code>. 1211 </p></dd> 1212<dt><span class="term">Throws:</span></dt> 1213<dd><p> 1214 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an 1215 error occurs. 1216 </p></dd> 1217<dt><span class="term">Error Conditions:</span></dt> 1218<dd> 1219<p> 1220 <span class="bold"><strong>operation_not_permitted</strong></span>: if the 1221 thread does not have the privilege to perform the operation. 1222 </p> 1223<p> 1224 <span class="bold"><strong>resource_deadlock_would_occur</strong></span>: 1225 if the implementation detects that a deadlock would occur. 1226 </p> 1227<p> 1228 <span class="bold"><strong>device_or_resource_busy</strong></span>: if the 1229 mutex is already locked and blocking is not possible. 1230 </p> 1231</dd> 1232<dt><span class="term">Thread safety:</span></dt> 1233<dd><p> 1234 If an exception is thrown then a lock shall not have been acquired 1235 for the current thread. 1236 </p></dd> 1237</dl> 1238</div> 1239</div> 1240<div class="section"> 1241<div class="titlepage"><div><div><h5 class="title"> 1242<a name="thread.synchronization.mutex_concepts.basic_lockable.unlock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span></code></a> 1243</h5></div></div></div> 1244<div class="variablelist"> 1245<p class="title"><b></b></p> 1246<dl class="variablelist"> 1247<dt><span class="term">Requires:</span></dt> 1248<dd><p> 1249 The current thread owns <code class="computeroutput"><span class="identifier">m</span></code>. 1250 </p></dd> 1251<dt><span class="term">Synchronization:</span></dt> 1252<dd><p> 1253 This operation synchronizes with subsequent lock operations that 1254 obtain ownership on the same object. 1255 </p></dd> 1256<dt><span class="term">Effects:</span></dt> 1257<dd><p> 1258 Releases a lock on <code class="computeroutput"><span class="identifier">m</span></code> 1259 by the current thread. 1260 </p></dd> 1261<dt><span class="term">Return type:</span></dt> 1262<dd><p> 1263 <code class="computeroutput"><span class="keyword">void</span></code>. 1264 </p></dd> 1265<dt><span class="term">Throws:</span></dt> 1266<dd><p> 1267 Nothing. 1268 </p></dd> 1269</dl> 1270</div> 1271</div> 1272<div class="section"> 1273<div class="titlepage"><div><div><h5 class="title"> 1274<a name="thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable" title="is_basic_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_basic_lockable</span></code> trait -- EXTENSION</a> 1275</h5></div></div></div> 1276<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span> 1277 1278<span class="keyword">namespace</span> <span class="identifier">boost</span> 1279<span class="special">{</span> 1280 <span class="keyword">namespace</span> <span class="identifier">sync</span> 1281 <span class="special">{</span> 1282 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1283 <span class="keyword">class</span> <span class="identifier">is_basic_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span> 1284 <span class="special">}</span> 1285<span class="special">}</span> 1286</pre> 1287<p> 1288 Some of the algorithms on mutexes use this trait via SFINAE. 1289 </p> 1290<p> 1291 This trait is true_type if the parameter L meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements. 1292 </p> 1293<div class="warning"><table border="0" summary="Warning"> 1294<tr> 1295<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 1296<th align="left">Warning</th> 1297</tr> 1298<tr><td align="left" valign="top"><p> 1299 If BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES is defined you will need 1300 to specialize this traits for the models of BasicLockable you could 1301 build. 1302 </p></td></tr> 1303</table></div> 1304</div> 1305</div> 1306<div class="section"> 1307<div class="titlepage"><div><div><h4 class="title"> 1308<a name="thread.synchronization.mutex_concepts.lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> Concept</a> 1309</h4></div></div></div> 1310<div class="toc"><dl class="toc"> 1311<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a></span></dt> 1312<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable.is_lockable"><code class="computeroutput"><span class="identifier">is_lockable</span></code> trait -- EXTENSION</a></span></dt> 1313</dl></div> 1314<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span> 1315<span class="keyword">namespace</span> <span class="identifier">boost</span> 1316<span class="special">{</span> 1317 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1318 <span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">;</span> 1319<span class="special">}</span> 1320</pre> 1321<p> 1322 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements if it meets 1323 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> requirements and 1324 the following expressions are well-formed and have the specified semantics 1325 (<code class="computeroutput"><span class="identifier">m</span></code> denotes a value of type 1326 <code class="computeroutput"><span class="identifier">L</span></code>): 1327 </p> 1328<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 1329 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span></code></a><span class="special">()</span></code> 1330 </li></ul></div> 1331<p> 1332 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 1333 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>. 1334 </p> 1335<div class="section"> 1336<div class="titlepage"><div><div><h5 class="title"> 1337<a name="thread.synchronization.mutex_concepts.lockable.try_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a> 1338</h5></div></div></div> 1339<div class="variablelist"> 1340<p class="title"><b></b></p> 1341<dl class="variablelist"> 1342<dt><span class="term">Requires:</span></dt> 1343<dd><p> 1344 The calling thread doesn't owns the mutex if the mutex is not recursive. 1345 </p></dd> 1346<dt><span class="term">Effects:</span></dt> 1347<dd><p> 1348 Attempt to obtain ownership for the current thread without blocking. 1349 </p></dd> 1350<dt><span class="term">Synchronization:</span></dt> 1351<dd><p> 1352 If <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code> 1353 returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> operations on the same object 1354 synchronize with this operation. 1355 </p></dd> 1356<dt><span class="term">Note:</span></dt> 1357<dd><p> 1358 Since <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code> 1359 does not synchronize with a failed subsequent <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>, the visibility rules are weak 1360 enough that little would be known about the state after a failure, 1361 even in the absence of spurious failures. 1362 </p></dd> 1363<dt><span class="term">Return type:</span></dt> 1364<dd><p> 1365 <code class="computeroutput"><span class="keyword">bool</span></code>. 1366 </p></dd> 1367<dt><span class="term">Returns:</span></dt> 1368<dd><p> 1369 <code class="computeroutput"><span class="keyword">true</span></code> if ownership 1370 was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 1371 otherwise. 1372 </p></dd> 1373<dt><span class="term">Postcondition:</span></dt> 1374<dd><p> 1375 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 1376 the current thread owns the <code class="computeroutput"><span class="identifier">m</span></code>. 1377 </p></dd> 1378<dt><span class="term">Throws:</span></dt> 1379<dd><p> 1380 Nothing. 1381 </p></dd> 1382</dl> 1383</div> 1384</div> 1385<div class="section"> 1386<div class="titlepage"><div><div><h5 class="title"> 1387<a name="thread.synchronization.mutex_concepts.lockable.is_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.is_lockable" title="is_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_lockable</span></code> trait -- EXTENSION</a> 1388</h5></div></div></div> 1389<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span> 1390<span class="keyword">namespace</span> <span class="identifier">boost</span> 1391<span class="special">{</span> 1392 <span class="keyword">namespace</span> <span class="identifier">sync</span> 1393 <span class="special">{</span> 1394 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1395 <span class="keyword">class</span> <span class="identifier">is_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span> 1396 <span class="special">}</span> 1397<span class="special">}</span> 1398</pre> 1399<p> 1400 Some of the algorithms on mutexes use this trait via SFINAE. 1401 </p> 1402<p> 1403 This trait is true_type if the parameter L meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements. 1404 </p> 1405<div class="warning"><table border="0" summary="Warning"> 1406<tr> 1407<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 1408<th align="left">Warning</th> 1409</tr> 1410<tr><td align="left" valign="top"><p> 1411 If BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES is defined you will need 1412 to specialize this traits for the models of Lockable you could build. 1413 </p></td></tr> 1414</table></div> 1415</div> 1416</div> 1417<div class="section"> 1418<div class="titlepage"><div><div><h4 class="title"> 1419<a name="thread.synchronization.mutex_concepts.recursive"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive" title="Recursive Lockable Concept">Recursive 1420 Lockable Concept</a> 1421</h4></div></div></div> 1422<div class="toc"><dl class="toc"> 1423<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole"><code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code> trait -- 1424 EXTENSION</a></span></dt> 1425<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable"><code class="computeroutput"><span class="identifier">is_recursive_basic_lockable</span></code> trait -- 1426 EXTENSION</a></span></dt> 1427<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_lockable"><code class="computeroutput"><span class="identifier">is_recursive_lockable</span></code> trait -- EXTENSION</a></span></dt> 1428</dl></div> 1429<p> 1430 The user could require that the mutex passed to an algorithm is a recursive 1431 one. Whether a lockable is recursive or not can not be checked using template 1432 meta-programming. This is the motivation for the following trait. 1433 </p> 1434<div class="section"> 1435<div class="titlepage"><div><div><h5 class="title"> 1436<a name="thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole" title="is_recursive_mutex_sur_parole trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code> trait -- 1437 EXTENSION</a> 1438</h5></div></div></div> 1439<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span> 1440 1441<span class="keyword">namespace</span> <span class="identifier">boost</span> 1442<span class="special">{</span> 1443 <span class="keyword">namespace</span> <span class="identifier">sync</span> 1444 <span class="special">{</span> 1445 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1446 <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special">:</span> <span class="identifier">false_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 1447 <span class="keyword">template</span><span class="special"><></span> 1448 <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special"><</span><span class="identifier">recursive_mutex</span><span class="special">>:</span> <span class="identifier">true_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 1449 <span class="keyword">template</span><span class="special"><></span> 1450 <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special"><</span><span class="identifier">timed_recursive_mutex</span><span class="special">>:</span> <span class="identifier">true_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 1451 <span class="special">}</span> 1452<span class="special">}</span> 1453</pre> 1454<p> 1455 The trait <code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code> 1456 is <code class="computeroutput"><span class="identifier">false_type</span></code> by default 1457 and is specialized for the provide <code class="computeroutput"><span class="identifier">recursive_mutex</span></code> 1458 and <code class="computeroutput"><span class="identifier">timed_recursive_mutex</span></code>. 1459 </p> 1460<p> 1461 It should be specialized by the user providing other model of recursive 1462 lockable. 1463 </p> 1464</div> 1465<div class="section"> 1466<div class="titlepage"><div><div><h5 class="title"> 1467<a name="thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable" title="is_recursive_basic_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_basic_lockable</span></code> trait -- 1468 EXTENSION</a> 1469</h5></div></div></div> 1470<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span> 1471<span class="keyword">namespace</span> <span class="identifier">boost</span> 1472<span class="special">{</span> 1473 <span class="keyword">namespace</span> <span class="identifier">sync</span> 1474 <span class="special">{</span> 1475 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1476 <span class="keyword">class</span> <span class="identifier">is_recursive_basic_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span> 1477 <span class="special">}</span> 1478<span class="special">}</span> 1479</pre> 1480<p> 1481 This traits is true_type if is_basic_lockable and is_recursive_mutex_sur_parole. 1482 </p> 1483</div> 1484<div class="section"> 1485<div class="titlepage"><div><div><h5 class="title"> 1486<a name="thread.synchronization.mutex_concepts.recursive.is_recursive_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_lockable" title="is_recursive_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_lockable</span></code> trait -- EXTENSION</a> 1487</h5></div></div></div> 1488<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_traits.hpp> </span> 1489<span class="keyword">namespace</span> <span class="identifier">boost</span> 1490<span class="special">{</span> 1491 <span class="keyword">namespace</span> <span class="identifier">sync</span> 1492 <span class="special">{</span> 1493 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1494 <span class="keyword">class</span> <span class="identifier">is_recursive_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span> 1495 <span class="special">}</span> 1496<span class="special">}</span> 1497</pre> 1498<p> 1499 This traits is true_type if is_lockable and is_recursive_mutex_sur_parole. 1500 </p> 1501</div> 1502</div> 1503<div class="section"> 1504<div class="titlepage"><div><div><h4 class="title"> 1505<a name="thread.synchronization.mutex_concepts.timed_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> Concept</a> 1506</h4></div></div></div> 1507<div class="toc"><dl class="toc"> 1508<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 1509<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 1510<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 1511<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 1512</dl></div> 1513<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span> 1514 1515<span class="keyword">namespace</span> <span class="identifier">boost</span> 1516<span class="special">{</span> 1517 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1518 <span class="keyword">class</span> <span class="identifier">TimedLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 1519<span class="special">}</span> 1520</pre> 1521<p> 1522 The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> refines 1523 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to add support 1524 for timeouts when trying to acquire the lock. 1525 </p> 1526<p> 1527 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> requirements if 1528 it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements and the 1529 following expressions are well-formed and have the specified semantics. 1530 </p> 1531<p> 1532 <span class="bold"><strong>Variables:</strong></span> 1533 </p> 1534<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1535<li class="listitem"> 1536 <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of 1537 type <code class="computeroutput"><span class="identifier">L</span></code>, 1538 </li> 1539<li class="listitem"> 1540 <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a 1541 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>, 1542 and 1543 </li> 1544<li class="listitem"> 1545 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a 1546 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>: 1547 </li> 1548</ul></div> 1549<p> 1550 <span class="bold"><strong>Expressions:</strong></span> 1551 </p> 1552<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1553<li class="listitem"> 1554 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> 1555 </li> 1556<li class="listitem"> 1557 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> 1558 </li> 1559</ul></div> 1560<p> 1561 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a> must be released 1562 through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a>. 1563 </p> 1564<div class="section"> 1565<div class="titlepage"><div><div><h5 class="title"> 1566<a name="thread.synchronization.mutex_concepts.timed_lockable.try_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a> 1567</h5></div></div></div> 1568<div class="variablelist"> 1569<p class="title"><b></b></p> 1570<dl class="variablelist"> 1571<dt><span class="term">Requires:</span></dt> 1572<dd><p> 1573 The calling thread doesn't owns the mutex if the mutex is not recursive. 1574 </p></dd> 1575<dt><span class="term">Effects:</span></dt> 1576<dd><p> 1577 Attempt to obtain ownership for the current thread. Blocks until 1578 ownership can be obtained, or the specified time is reached. If 1579 the specified time has already passed, behaves as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>. 1580 </p></dd> 1581<dt><span class="term">Synchronization:</span></dt> 1582<dd><p> 1583 If <code class="computeroutput"><span class="identifier">try_lock_until</span><span class="special">()</span></code> returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> 1584 operations on the same object synchronize with this operation. 1585 </p></dd> 1586<dt><span class="term">Return type:</span></dt> 1587<dd><p> 1588 <code class="computeroutput"><span class="keyword">bool</span></code>. 1589 </p></dd> 1590<dt><span class="term">Returns:</span></dt> 1591<dd><p> 1592 <code class="computeroutput"><span class="keyword">true</span></code> if ownership 1593 was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 1594 otherwise. 1595 </p></dd> 1596<dt><span class="term">Postcondition:</span></dt> 1597<dd><p> 1598 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 1599 the current thread owns <code class="computeroutput"><span class="identifier">m</span></code>. 1600 </p></dd> 1601<dt><span class="term">Throws:</span></dt> 1602<dd><p> 1603 Nothing. 1604 </p></dd> 1605</dl> 1606</div> 1607</div> 1608<div class="section"> 1609<div class="titlepage"><div><div><h5 class="title"> 1610<a name="thread.synchronization.mutex_concepts.timed_lockable.try_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a> 1611</h5></div></div></div> 1612<div class="variablelist"> 1613<p class="title"><b></b></p> 1614<dl class="variablelist"> 1615<dt><span class="term">Requires:</span></dt> 1616<dd><p> 1617 The calling thread doesn't owns the mutex if the mutex is not recursive. 1618 </p></dd> 1619<dt><span class="term">Effects:</span></dt> 1620<dd><p> 1621 As-if <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">rel_time</span><span class="special">)</span></code>. 1622 </p></dd> 1623<dt><span class="term">Synchronization:</span></dt> 1624<dd><p> 1625 If <code class="computeroutput"><span class="identifier">try_lock_for</span><span class="special">()</span></code> returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> 1626 operations on the same object synchronize with this operation. 1627 </p></dd> 1628</dl> 1629</div> 1630</div> 1631<div class="warning"><table border="0" summary="Warning"> 1632<tr> 1633<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 1634<th align="left">Warning</th> 1635</tr> 1636<tr><td align="left" valign="top"> 1637<p> 1638 DEPRECATED since 4.00. The following expressions were required on version 1639 2, but are now deprecated. 1640 </p> 1641<p> 1642 Use instead <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a>. 1643 </p> 1644</td></tr> 1645</table></div> 1646<p> 1647 <span class="bold"><strong>Variables:</strong></span> 1648 </p> 1649<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1650<li class="listitem"> 1651 <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a 1652 value of an instantiation of an unspecified <code class="computeroutput"><span class="identifier">DurationType</span></code> 1653 arithmetic compatible with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>, 1654 and 1655 </li> 1656<li class="listitem"> 1657 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a 1658 value of an instantiation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>: 1659 </li> 1660</ul></div> 1661<p> 1662 <span class="bold"><strong>Expressions:</strong></span> 1663 </p> 1664<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1665<li class="listitem"> 1666 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> 1667 </li> 1668<li class="listitem"> 1669 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> 1670 </li> 1671</ul></div> 1672<p> 1673 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a> 1674 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>. 1675 </p> 1676<div class="section"> 1677<div class="titlepage"><div><div><h5 class="title"> 1678<a name="thread.synchronization.mutex_concepts.timed_lockable.timed_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a> 1679</h5></div></div></div> 1680<div class="variablelist"> 1681<p class="title"><b></b></p> 1682<dl class="variablelist"> 1683<dt><span class="term">Effects:</span></dt> 1684<dd><p> 1685 Attempt to obtain ownership for the current thread. Blocks until 1686 ownership can be obtained, or the specified time is reached. If 1687 the specified time has already passed, behaves as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>. 1688 </p></dd> 1689<dt><span class="term">Returns:</span></dt> 1690<dd><p> 1691 <code class="computeroutput"><span class="keyword">true</span></code> if ownership 1692 was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 1693 otherwise. 1694 </p></dd> 1695<dt><span class="term">Postcondition:</span></dt> 1696<dd><p> 1697 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 1698 the current thread owns <code class="computeroutput"><span class="identifier">m</span></code>. 1699 </p></dd> 1700<dt><span class="term">Throws:</span></dt> 1701<dd><p> 1702 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an 1703 error occurs. 1704 </p></dd> 1705</dl> 1706</div> 1707</div> 1708<div class="section"> 1709<div class="titlepage"><div><div><h5 class="title"> 1710<a name="thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a> 1711</h5></div></div></div> 1712<div class="variablelist"> 1713<p class="title"><b></b></p> 1714<dl class="variablelist"> 1715<dt><span class="term">Effects:</span></dt> 1716<dd><p> 1717 As-if <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()+</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>. 1718 </p></dd> 1719</dl> 1720</div> 1721</div> 1722</div> 1723<div class="section"> 1724<div class="titlepage"><div><div><h4 class="title"> 1725<a name="thread.synchronization.mutex_concepts.shared_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> Concept -- C++14</a> 1726</h4></div></div></div> 1727<div class="toc"><dl class="toc"> 1728<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a></span></dt> 1729<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a></span></dt> 1730<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 1731<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">))</span></code></a></span></dt> 1732<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a></span></dt> 1733<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 1734</dl></div> 1735<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span> 1736 1737<span class="keyword">namespace</span> <span class="identifier">boost</span> 1738<span class="special">{</span> 1739 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 1740 <span class="keyword">class</span> <span class="identifier">SharedLockable</span><span class="special">;</span> <span class="comment">// C++14</span> 1741<span class="special">}</span> 1742</pre> 1743<p> 1744 The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> is a refinement 1745 of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> that allows 1746 for <span class="emphasis"><em>shared ownership</em></span> as well as <span class="emphasis"><em>exclusive 1747 ownership</em></span>. This is the standard multiple-reader / single-write 1748 model: at most one thread can have exclusive ownership, and if any thread 1749 does have exclusive ownership, no other threads can have shared or exclusive 1750 ownership. Alternatively, many threads may have shared ownership. 1751 </p> 1752<p> 1753 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> requirements if 1754 it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> requirements and 1755 the following expressions are well-formed and have the specified semantics. 1756 </p> 1757<p> 1758 <span class="bold"><strong>Variables:</strong></span> 1759 </p> 1760<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1761<li class="listitem"> 1762 <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of 1763 type <code class="computeroutput"><span class="identifier">L</span></code>, 1764 </li> 1765<li class="listitem"> 1766 <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a 1767 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>, 1768 and 1769 </li> 1770<li class="listitem"> 1771 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a 1772 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>: 1773 </li> 1774</ul></div> 1775<p> 1776 <span class="bold"><strong>Expressions:</strong></span> 1777 </p> 1778<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 1779<li class="listitem"> 1780 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">();</span></code> 1781 </li> 1782<li class="listitem"> 1783 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span></code></a><span class="special">()</span></code> 1784 </li> 1785<li class="listitem"> 1786 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> 1787 </li> 1788<li class="listitem"> 1789 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> 1790 </li> 1791<li class="listitem"> 1792 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">();</span></code> 1793 </li> 1794</ul></div> 1795<p> 1796 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>, 1797 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>, 1798 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a> must be 1799 released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>. 1800 </p> 1801<div class="section"> 1802<div class="titlepage"><div><div><h5 class="title"> 1803<a name="thread.synchronization.mutex_concepts.shared_lockable.lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a> 1804</h5></div></div></div> 1805<div class="variablelist"> 1806<p class="title"><b></b></p> 1807<dl class="variablelist"> 1808<dt><span class="term">Effects:</span></dt> 1809<dd><p> 1810 The current thread blocks until shared ownership can be obtained 1811 for the current thread. 1812 </p></dd> 1813<dt><span class="term">Postcondition:</span></dt> 1814<dd><p> 1815 The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 1816 </p></dd> 1817<dt><span class="term">Throws:</span></dt> 1818<dd><p> 1819 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an 1820 error occurs. 1821 </p></dd> 1822</dl> 1823</div> 1824</div> 1825<div class="section"> 1826<div class="titlepage"><div><div><h5 class="title"> 1827<a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a> 1828</h5></div></div></div> 1829<div class="variablelist"> 1830<p class="title"><b></b></p> 1831<dl class="variablelist"> 1832<dt><span class="term">Effects:</span></dt> 1833<dd><p> 1834 Attempt to obtain shared ownership for the current thread without 1835 blocking. 1836 </p></dd> 1837<dt><span class="term">Returns:</span></dt> 1838<dd><p> 1839 <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership 1840 was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 1841 otherwise. 1842 </p></dd> 1843<dt><span class="term">Postcondition:</span></dt> 1844<dd><p> 1845 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 1846 the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 1847 </p></dd> 1848<dt><span class="term">Throws:</span></dt> 1849<dd><p> 1850 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an 1851 error occurs. 1852 </p></dd> 1853</dl> 1854</div> 1855</div> 1856<div class="section"> 1857<div class="titlepage"><div><div><h5 class="title"> 1858<a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a> 1859</h5></div></div></div> 1860<div class="variablelist"> 1861<p class="title"><b></b></p> 1862<dl class="variablelist"> 1863<dt><span class="term">Effects:</span></dt> 1864<dd><p> 1865 Attempt to obtain shared ownership for the current thread. Blocks 1866 until shared ownership can be obtained, or the specified duration 1867 is elapsed. If the specified duration is already elapsed, behaves 1868 as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>. 1869 </p></dd> 1870<dt><span class="term">Returns:</span></dt> 1871<dd><p> 1872 <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership 1873 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 1874 otherwise. 1875 </p></dd> 1876<dt><span class="term">Postcondition:</span></dt> 1877<dd><p> 1878 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 1879 the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 1880 </p></dd> 1881<dt><span class="term">Throws:</span></dt> 1882<dd><p> 1883 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an 1884 error occurs. 1885 </p></dd> 1886</dl> 1887</div> 1888</div> 1889<div class="section"> 1890<div class="titlepage"><div><div><h5 class="title"> 1891<a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">))</span></code></a> 1892</h5></div></div></div> 1893<div class="variablelist"> 1894<p class="title"><b></b></p> 1895<dl class="variablelist"> 1896<dt><span class="term">Effects:</span></dt> 1897<dd><p> 1898 Attempt to obtain shared ownership for the current thread. Blocks 1899 until shared ownership can be obtained, or the specified time is 1900 reached. If the specified time has already passed, behaves as 1901 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>. 1902 </p></dd> 1903<dt><span class="term">Returns:</span></dt> 1904<dd><p> 1905 <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership 1906 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 1907 otherwise. 1908 </p></dd> 1909<dt><span class="term">Postcondition:</span></dt> 1910<dd><p> 1911 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 1912 the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 1913 </p></dd> 1914<dt><span class="term">Throws:</span></dt> 1915<dd><p> 1916 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an 1917 error occurs. 1918 </p></dd> 1919</dl> 1920</div> 1921</div> 1922<div class="section"> 1923<div class="titlepage"><div><div><h5 class="title"> 1924<a name="thread.synchronization.mutex_concepts.shared_lockable.unlock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a> 1925</h5></div></div></div> 1926<div class="variablelist"> 1927<p class="title"><b></b></p> 1928<dl class="variablelist"> 1929<dt><span class="term">Precondition:</span></dt> 1930<dd><p> 1931 The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 1932 </p></dd> 1933<dt><span class="term">Effects:</span></dt> 1934<dd><p> 1935 Releases shared ownership of <code class="computeroutput"><span class="identifier">m</span></code> 1936 by the current thread. 1937 </p></dd> 1938<dt><span class="term">Postcondition:</span></dt> 1939<dd><p> 1940 The current thread no longer has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 1941 </p></dd> 1942<dt><span class="term">Throws:</span></dt> 1943<dd><p> 1944 Nothing 1945 </p></dd> 1946</dl> 1947</div> 1948</div> 1949<div class="warning"><table border="0" summary="Warning"> 1950<tr> 1951<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 1952<th align="left">Warning</th> 1953</tr> 1954<tr><td align="left" valign="top"> 1955<p> 1956 DEPRECATED since 3.00. The following expressions were required on version 1957 2, but are now deprecated. 1958 </p> 1959<p> 1960 Use instead <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a>. 1961 </p> 1962</td></tr> 1963</table></div> 1964<p> 1965 <span class="bold"><strong>Variables:</strong></span> 1966 </p> 1967<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 1968 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a 1969 value of an instantiation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>: 1970 </li></ul></div> 1971<p> 1972 <span class="bold"><strong>Expressions:</strong></span> 1973 </p> 1974<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 1975 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code> 1976 </li></ul></div> 1977<p> 1978 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a> 1979 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>. 1980 </p> 1981<div class="section"> 1982<div class="titlepage"><div><div><h5 class="title"> 1983<a name="thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a> 1984</h5></div></div></div> 1985<div class="variablelist"> 1986<p class="title"><b></b></p> 1987<dl class="variablelist"> 1988<dt><span class="term">Effects:</span></dt> 1989<dd><p> 1990 Attempt to obtain shared ownership for the current thread. Blocks 1991 until shared ownership can be obtained, or the specified time is 1992 reached. If the specified time has already passed, behaves as 1993 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>. 1994 </p></dd> 1995<dt><span class="term">Returns:</span></dt> 1996<dd><p> 1997 <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership 1998 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 1999 otherwise. 2000 </p></dd> 2001<dt><span class="term">Postcondition:</span></dt> 2002<dd><p> 2003 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2004 the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2005 </p></dd> 2006<dt><span class="term">Throws:</span></dt> 2007<dd><p> 2008 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an 2009 error occurs. 2010 </p></dd> 2011</dl> 2012</div> 2013</div> 2014</div> 2015<div class="section"> 2016<div class="titlepage"><div><div><h4 class="title"> 2017<a name="thread.synchronization.mutex_concepts.upgrade_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> Concept -- EXTENSION</a> 2018</h4></div></div></div> 2019<div class="toc"><dl class="toc"> 2020<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a></span></dt> 2021<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a></span></dt> 2022<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade</span><span class="special">()</span></code></a></span></dt> 2023<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 2024<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 2025<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code></a></span></dt> 2026<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 2027<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 2028<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_shared</span><span class="special">()</span></code></a></span></dt> 2029<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">()</span></code></a></span></dt> 2030<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 2031<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 2032<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_upgrade</span><span class="special">()</span></code></a></span></dt> 2033<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock</span><span class="special">()</span></code></a></span></dt> 2034<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">()</span></code></a></span></dt> 2035<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 2036<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 2037<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">()</span></code></a></span></dt> 2038</dl></div> 2039<pre class="programlisting"><span class="comment">// #include <boost/thread/lockable_concepts.hpp> </span> 2040 2041<span class="keyword">namespace</span> <span class="identifier">boost</span> 2042<span class="special">{</span> 2043 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">></span> 2044 <span class="keyword">class</span> <span class="identifier">UpgradeLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 2045<span class="special">}</span> 2046</pre> 2047<p> 2048 The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a> is a refinement 2049 of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> that allows 2050 for <span class="emphasis"><em>upgradable ownership</em></span> as well as <span class="emphasis"><em>shared 2051 ownership</em></span> and <span class="emphasis"><em>exclusive ownership</em></span>. This 2052 is an extension to the multiple-reader / single-write model provided by 2053 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a>: a single 2054 thread may have <span class="emphasis"><em>upgradable ownership</em></span> at the same time 2055 as others have <span class="emphasis"><em>shared ownership</em></span>. The thread with 2056 <span class="emphasis"><em>upgradable ownership</em></span> may at any time attempt to upgrade 2057 that ownership to <span class="emphasis"><em>exclusive ownership</em></span>. If no other 2058 threads have shared ownership, the upgrade is completed immediately, and 2059 the thread now has <span class="emphasis"><em>exclusive ownership</em></span>, which must 2060 be relinquished by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>, 2061 just as if it had been acquired by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>. 2062 </p> 2063<p> 2064 If a thread with <span class="emphasis"><em>upgradable ownership</em></span> tries to upgrade 2065 whilst other threads have <span class="emphasis"><em>shared ownership</em></span>, the attempt 2066 will fail and the thread will block until <span class="emphasis"><em>exclusive ownership</em></span> 2067 can be acquired. 2068 </p> 2069<p> 2070 Ownership can also be <span class="emphasis"><em>downgraded</em></span> as well as <span class="emphasis"><em>upgraded</em></span>: 2071 exclusive ownership of an implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a> can be 2072 downgraded to upgradable ownership or shared ownership, and upgradable 2073 ownership can be downgraded to plain shared ownership. 2074 </p> 2075<p> 2076 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> requirements if 2077 it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> requirements and 2078 the following expressions are well-formed and have the specified semantics. 2079 </p> 2080<p> 2081 <span class="bold"><strong>Variables:</strong></span> 2082 </p> 2083<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 2084<li class="listitem"> 2085 <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of 2086 type <code class="computeroutput"><span class="identifier">L</span></code>, 2087 </li> 2088<li class="listitem"> 2089 <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a 2090 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>, 2091 and 2092 </li> 2093<li class="listitem"> 2094 <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a 2095 value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>: 2096 </li> 2097</ul></div> 2098<p> 2099 <span class="bold"><strong>Expressions:</strong></span> 2100 </p> 2101<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 2102<li class="listitem"> 2103 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">lock_upgrade</span></code></a><span class="special">();</span></code> 2104 </li> 2105<li class="listitem"> 2106 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> 2107 </li> 2108<li class="listitem"> 2109 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code> 2110 </li> 2111<li class="listitem"> 2112 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> 2113 </li> 2114<li class="listitem"> 2115 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> 2116 </li> 2117<li class="listitem"> 2118 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared" title="m.unlock_and_lock_shared()"><code class="computeroutput"><span class="identifier">unlock_and_lock_shared</span></code></a><span class="special">()</span></code> 2119 </li> 2120<li class="listitem"> 2121 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade" title="m.unlock_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_and_lock_upgrade</span></code></a><span class="special">();</span></code> 2122 </li> 2123<li class="listitem"> 2124 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock" title="m.unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">unlock_upgrade_and_lock</span></code></a><span class="special">();</span></code> 2125 </li> 2126<li class="listitem"> 2127 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code> 2128 </li> 2129<li class="listitem"> 2130 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> 2131 </li> 2132<li class="listitem"> 2133 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until" title="m.try_unlock_upgrade_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> 2134 </li> 2135<li class="listitem"> 2136 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared" title="m.unlock_upgrade_and_lock_shared()"><code class="computeroutput"><span class="identifier">unlock_upgrade_and_lock_shared</span></code></a><span class="special">();</span></code> 2137 </li> 2138</ul></div> 2139<p> 2140 If `BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS is defined the 2141 following expressions are also required: 2142 </p> 2143<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 2144<li class="listitem"> 2145 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">();</span></code> 2146 </li> 2147<li class="listitem"> 2148 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">);</span></code> 2149 </li> 2150<li class="listitem"> 2151 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code> 2152 </li> 2153<li class="listitem"> 2154 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">();</span></code> 2155 </li> 2156<li class="listitem"> 2157 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">);</span></code> 2158 </li> 2159<li class="listitem"> 2160 <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code> 2161 </li> 2162</ul></div> 2163<p> 2164 Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a> 2165 must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>. 2166 If the ownership type is changed through a call to one of the <code class="computeroutput"><span class="identifier">unlock_xxx_and_lock_yyy</span><span class="special">()</span></code> 2167 functions, ownership must be released through a call to the unlock function 2168 corresponding to the new level of ownership. 2169 </p> 2170<div class="section"> 2171<div class="titlepage"><div><div><h5 class="title"> 2172<a name="thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a> 2173</h5></div></div></div> 2174<div class="variablelist"> 2175<p class="title"><b></b></p> 2176<dl class="variablelist"> 2177<dt><span class="term">Precondition:</span></dt> 2178<dd><p> 2179 The calling thread has no ownership of the mutex. 2180 </p></dd> 2181<dt><span class="term">Effects:</span></dt> 2182<dd><p> 2183 The current thread blocks until upgrade ownership can be obtained 2184 for the current thread. 2185 </p></dd> 2186<dt><span class="term">Postcondition:</span></dt> 2187<dd><p> 2188 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2189 </p></dd> 2190<dt><span class="term">Synchronization:</span></dt> 2191<dd><p> 2192 Prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object 2193 synchronize with this operation. 2194 </p></dd> 2195<dt><span class="term">Throws:</span></dt> 2196<dd><p> 2197 <code class="computeroutput"><span class="identifier">lock_error</span></code> if an 2198 error occurs. 2199 </p></dd> 2200</dl> 2201</div> 2202</div> 2203<div class="section"> 2204<div class="titlepage"><div><div><h5 class="title"> 2205<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a> 2206</h5></div></div></div> 2207<div class="variablelist"> 2208<p class="title"><b></b></p> 2209<dl class="variablelist"> 2210<dt><span class="term">Precondition:</span></dt> 2211<dd><p> 2212 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2213 </p></dd> 2214<dt><span class="term">Effects:</span></dt> 2215<dd><p> 2216 Releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code> 2217 by the current thread. 2218 </p></dd> 2219<dt><span class="term">Postcondition:</span></dt> 2220<dd><p> 2221 The current thread no longer has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2222 </p></dd> 2223<dt><span class="term">Synchronization:</span></dt> 2224<dd><p> 2225 This operation synchronizes with subsequent lock operations that 2226 obtain ownership on the same object. 2227 </p></dd> 2228<dt><span class="term">Throws:</span></dt> 2229<dd><p> 2230 Nothing 2231 </p></dd> 2232</dl> 2233</div> 2234</div> 2235<div class="section"> 2236<div class="titlepage"><div><div><h5 class="title"> 2237<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade</span><span class="special">()</span></code></a> 2238</h5></div></div></div> 2239<div class="variablelist"> 2240<p class="title"><b></b></p> 2241<dl class="variablelist"> 2242<dt><span class="term">Precondition:</span></dt> 2243<dd><p> 2244 The calling thread has no ownership of the mutex. 2245 </p></dd> 2246<dt><span class="term">Effects:</span></dt> 2247<dd><p> 2248 Attempts to obtain upgrade ownership of the mutex for the calling 2249 thread without blocking. If upgrade ownership is not obtained, 2250 there is no effect and try_lock_upgrade() immediately returns. 2251 </p></dd> 2252<dt><span class="term">Returns:</span></dt> 2253<dd><p> 2254 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership 2255 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2256 otherwise. 2257 </p></dd> 2258<dt><span class="term">Postcondition:</span></dt> 2259<dd><p> 2260 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2261 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2262 </p></dd> 2263<dt><span class="term">Synchronization:</span></dt> 2264<dd><p> 2265 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object 2266 synchronize with this operation. 2267 </p></dd> 2268<dt><span class="term">Throws:</span></dt> 2269<dd><p> 2270 Nothing 2271 </p></dd> 2272</dl> 2273</div> 2274</div> 2275<div class="section"> 2276<div class="titlepage"><div><div><h5 class="title"> 2277<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a> 2278</h5></div></div></div> 2279<div class="variablelist"> 2280<p class="title"><b></b></p> 2281<dl class="variablelist"> 2282<dt><span class="term">Precondition:</span></dt> 2283<dd><p> 2284 The calling thread has no ownership of the mutex. 2285 </p></dd> 2286<dt><span class="term">Effects:</span></dt> 2287<dd><p> 2288 If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code> 2289 is not exactly convertible to the native tick period, the duration 2290 shall be rounded up to the nearest native tick period. Attempts 2291 to obtain upgrade lock ownership for the calling thread within 2292 the relative timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>. 2293 If the time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> 2294 is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain 2295 ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code>). The function returns within 2296 the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> 2297 only if it has obtained upgrade ownership of the mutex object. 2298 </p></dd> 2299<dt><span class="term">Returns:</span></dt> 2300<dd><p> 2301 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership 2302 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2303 otherwise. 2304 </p></dd> 2305<dt><span class="term">Postcondition:</span></dt> 2306<dd><p> 2307 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2308 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2309 </p></dd> 2310<dt><span class="term">Synchronization:</span></dt> 2311<dd><p> 2312 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object 2313 synchronize with this operation. 2314 </p></dd> 2315<dt><span class="term">Throws:</span></dt> 2316<dd><p> 2317 Nothing 2318 </p></dd> 2319<dt><span class="term">Notes:</span></dt> 2320<dd><p> 2321 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2322 is defined on Windows platform 2323 </p></dd> 2324</dl> 2325</div> 2326</div> 2327<div class="section"> 2328<div class="titlepage"><div><div><h5 class="title"> 2329<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a> 2330</h5></div></div></div> 2331<div class="variablelist"> 2332<p class="title"><b></b></p> 2333<dl class="variablelist"> 2334<dt><span class="term">Precondition:</span></dt> 2335<dd><p> 2336 The calling thread has no ownership of the mutex. 2337 </p></dd> 2338<dt><span class="term">Effects:</span></dt> 2339<dd><p> 2340 The function attempts to obtain upgrade ownership of the mutex. 2341 If <code class="computeroutput"><span class="identifier">abs_time</span></code> has 2342 already passed, the function attempts to obtain upgrade ownership 2343 without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code>). The function returns before 2344 the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 2345 only if it has obtained upgrade ownership of the mutex object. 2346 </p></dd> 2347<dt><span class="term">Returns:</span></dt> 2348<dd><p> 2349 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership 2350 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2351 otherwise. 2352 </p></dd> 2353<dt><span class="term">Postcondition:</span></dt> 2354<dd><p> 2355 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2356 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2357 </p></dd> 2358<dt><span class="term">Synchronization:</span></dt> 2359<dd><p> 2360 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object 2361 synchronize with this operation. 2362 </p></dd> 2363<dt><span class="term">Throws:</span></dt> 2364<dd><p> 2365 Nothing 2366 </p></dd> 2367<dt><span class="term">Notes:</span></dt> 2368<dd><p> 2369 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2370 is defined on Windows platform 2371 </p></dd> 2372</dl> 2373</div> 2374</div> 2375<div class="section"> 2376<div class="titlepage"><div><div><h5 class="title"> 2377<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code></a> 2378</h5></div></div></div> 2379<div class="variablelist"> 2380<p class="title"><b></b></p> 2381<dl class="variablelist"> 2382<dt><span class="term">Precondition:</span></dt> 2383<dd><p> 2384 The calling thread must hold a shared lock on the mutex. 2385 </p></dd> 2386<dt><span class="term">Effects:</span></dt> 2387<dd><p> 2388 The function attempts to atomically convert the ownership from 2389 shared to exclusive for the calling thread without blocking. For 2390 this conversion to be successful, this thread must be the only 2391 thread holding any ownership of the lock. If the conversion is 2392 not successful, the shared ownership of m is retained. 2393 </p></dd> 2394<dt><span class="term">Returns:</span></dt> 2395<dd><p> 2396 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive 2397 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2398 otherwise. 2399 </p></dd> 2400<dt><span class="term">Postcondition:</span></dt> 2401<dd><p> 2402 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2403 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2404 </p></dd> 2405<dt><span class="term">Synchronization:</span></dt> 2406<dd><p> 2407 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code> 2408 and subsequent lock operations on the same object synchronize with 2409 this operation. 2410 </p></dd> 2411<dt><span class="term">Throws:</span></dt> 2412<dd><p> 2413 Nothing 2414 </p></dd> 2415<dt><span class="term">Notes:</span></dt> 2416<dd><p> 2417 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 2418 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2419 is defined on Windows platform 2420 </p></dd> 2421</dl> 2422</div> 2423</div> 2424<div class="section"> 2425<div class="titlepage"><div><div><h5 class="title"> 2426<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a> 2427</h5></div></div></div> 2428<div class="variablelist"> 2429<p class="title"><b></b></p> 2430<dl class="variablelist"> 2431<dt><span class="term">Precondition:</span></dt> 2432<dd><p> 2433 The calling thread shall hold a shared lock on the mutex. 2434 </p></dd> 2435<dt><span class="term">Effects:</span></dt> 2436<dd><p> 2437 If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code> 2438 is not exactly convertible to the native tick period, the duration 2439 shall be rounded up to the nearest native tick period. The function 2440 attempts to atomically convert the ownership from shared to exclusive 2441 for the calling thread within the relative timeout specified by 2442 <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the 2443 time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> 2444 is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain 2445 exclusive ownership without blocking (as if by calling <code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>). 2446 The function shall return within the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> only if it has obtained 2447 exclusive ownership of the mutex object. For this conversion to 2448 be successful, this thread must be the only thread holding any 2449 ownership of the lock at the moment of conversion. If the conversion 2450 is not successful, the shared ownership of the mutex is retained. 2451 </p></dd> 2452<dt><span class="term">Returns:</span></dt> 2453<dd><p> 2454 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive 2455 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2456 otherwise. 2457 </p></dd> 2458<dt><span class="term">Postcondition:</span></dt> 2459<dd><p> 2460 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2461 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2462 </p></dd> 2463<dt><span class="term">Synchronization:</span></dt> 2464<dd><p> 2465 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code> 2466 and subsequent lock operations on the same object synchronize with 2467 this operation. 2468 </p></dd> 2469<dt><span class="term">Throws:</span></dt> 2470<dd><p> 2471 Nothing 2472 </p></dd> 2473<dt><span class="term">Notes:</span></dt> 2474<dd><p> 2475 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 2476 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2477 is defined on Windows platform 2478 </p></dd> 2479</dl> 2480</div> 2481</div> 2482<div class="section"> 2483<div class="titlepage"><div><div><h5 class="title"> 2484<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a> 2485</h5></div></div></div> 2486<div class="variablelist"> 2487<p class="title"><b></b></p> 2488<dl class="variablelist"> 2489<dt><span class="term">Precondition:</span></dt> 2490<dd><p> 2491 The calling thread shall hold a shared lock on the mutex. 2492 </p></dd> 2493<dt><span class="term">Effects:</span></dt> 2494<dd><p> 2495 The function attempts to atomically convert the ownership from 2496 shared to exclusive for the calling thread within the absolute 2497 timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>. 2498 If <code class="computeroutput"><span class="identifier">abs_time</span></code> has 2499 already passed, the function attempts to obtain exclusive ownership 2500 without blocking (as if by calling <code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>). The function shall return before 2501 the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 2502 only if it has obtained exclusive ownership of the mutex object. 2503 For this conversion to be successful, this thread must be the only 2504 thread holding any ownership of the lock at the moment of conversion. 2505 If the conversion is not successful, the shared ownership of the 2506 mutex is retained. 2507 </p></dd> 2508<dt><span class="term">Returns:</span></dt> 2509<dd><p> 2510 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive 2511 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2512 otherwise. 2513 </p></dd> 2514<dt><span class="term">Postcondition:</span></dt> 2515<dd><p> 2516 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2517 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2518 </p></dd> 2519<dt><span class="term">Synchronization:</span></dt> 2520<dd><p> 2521 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code> 2522 and subsequent lock operations on the same object synchronize with 2523 this operation. 2524 </p></dd> 2525<dt><span class="term">Throws:</span></dt> 2526<dd><p> 2527 Nothing 2528 </p></dd> 2529<dt><span class="term">Notes:</span></dt> 2530<dd><p> 2531 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 2532 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2533 is defined on Windows platform 2534 </p></dd> 2535</dl> 2536</div> 2537</div> 2538<div class="section"> 2539<div class="titlepage"><div><div><h5 class="title"> 2540<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared" title="m.unlock_and_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_shared</span><span class="special">()</span></code></a> 2541</h5></div></div></div> 2542<div class="variablelist"> 2543<p class="title"><b></b></p> 2544<dl class="variablelist"> 2545<dt><span class="term">Precondition:</span></dt> 2546<dd><p> 2547 The calling thread shall hold an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>. 2548 </p></dd> 2549<dt><span class="term">Effects:</span></dt> 2550<dd><p> 2551 Atomically converts the ownership from exclusive to shared for 2552 the calling thread. 2553 </p></dd> 2554<dt><span class="term">Postcondition:</span></dt> 2555<dd><p> 2556 The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2557 </p></dd> 2558<dt><span class="term">Synchronization:</span></dt> 2559<dd><p> 2560 This operation synchronizes with subsequent lock operations that 2561 obtain ownership of the same object. 2562 </p></dd> 2563<dt><span class="term">Throws:</span></dt> 2564<dd><p> 2565 Nothing 2566 </p></dd> 2567</dl> 2568</div> 2569</div> 2570<div class="section"> 2571<div class="titlepage"><div><div><h5 class="title"> 2572<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">()</span></code></a> 2573</h5></div></div></div> 2574<div class="variablelist"> 2575<p class="title"><b></b></p> 2576<dl class="variablelist"> 2577<dt><span class="term">Precondition:</span></dt> 2578<dd><p> 2579 The calling thread shall hold a shared lock on the mutex. 2580 </p></dd> 2581<dt><span class="term">Effects:</span></dt> 2582<dd><p> 2583 The function attempts to atomically convert the ownership from 2584 shared to upgrade for the calling thread without blocking. For 2585 this conversion to be successful, there must be no thread holding 2586 upgrade ownership of this object. If the conversion is not successful, 2587 the shared ownership of the mutex is retained. 2588 </p></dd> 2589<dt><span class="term">Returns:</span></dt> 2590<dd><p> 2591 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership 2592 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2593 otherwise. 2594 </p></dd> 2595<dt><span class="term">Postcondition:</span></dt> 2596<dd><p> 2597 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2598 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2599 </p></dd> 2600<dt><span class="term">Synchronization:</span></dt> 2601<dd><p> 2602 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations 2603 on the same object synchronize with this operation. 2604 </p></dd> 2605<dt><span class="term">Throws:</span></dt> 2606<dd><p> 2607 Nothing 2608 </p></dd> 2609<dt><span class="term">Notes:</span></dt> 2610<dd><p> 2611 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 2612 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2613 is defined on Windows platform 2614 </p></dd> 2615</dl> 2616</div> 2617</div> 2618<div class="section"> 2619<div class="titlepage"><div><div><h5 class="title"> 2620<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a> 2621</h5></div></div></div> 2622<div class="variablelist"> 2623<p class="title"><b></b></p> 2624<dl class="variablelist"> 2625<dt><span class="term">Precondition:</span></dt> 2626<dd><p> 2627 The calling thread shall hold a shared lock on the mutex. 2628 </p></dd> 2629<dt><span class="term">Effects:</span></dt> 2630<dd><p> 2631 If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code> 2632 is not exactly convertible to the native tick period, the duration 2633 shall be rounded up to the nearest native tick period. The function 2634 attempts to atomically convert the ownership from shared to upgrade 2635 for the calling thread within the relative timeout specified by 2636 <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the 2637 time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> 2638 is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain 2639 upgrade ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code>). The function shall return within 2640 the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> 2641 only if it has obtained exclusive ownership of the mutex object. 2642 For this conversion to be successful, there must be no thread holding 2643 upgrade ownership of this object at the moment of conversion. If 2644 the conversion is not successful, the shared ownership of m is 2645 retained. 2646 </p></dd> 2647<dt><span class="term">Returns:</span></dt> 2648<dd><p> 2649 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership 2650 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2651 otherwise. 2652 </p></dd> 2653<dt><span class="term">Postcondition:</span></dt> 2654<dd><p> 2655 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2656 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2657 </p></dd> 2658<dt><span class="term">Synchronization:</span></dt> 2659<dd><p> 2660 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations 2661 on the same object synchronize with this operation. 2662 </p></dd> 2663<dt><span class="term">Throws:</span></dt> 2664<dd><p> 2665 Nothing 2666 </p></dd> 2667<dt><span class="term">Notes:</span></dt> 2668<dd><p> 2669 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 2670 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2671 is defined on Windows platform 2672 </p></dd> 2673</dl> 2674</div> 2675</div> 2676<div class="section"> 2677<div class="titlepage"><div><div><h5 class="title"> 2678<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a> 2679</h5></div></div></div> 2680<div class="variablelist"> 2681<p class="title"><b></b></p> 2682<dl class="variablelist"> 2683<dt><span class="term">Precondition:</span></dt> 2684<dd><p> 2685 The calling thread shall hold a shared lock on the mutex. 2686 </p></dd> 2687<dt><span class="term">Effects:</span></dt> 2688<dd><p> 2689 The function attempts to atomically convert the ownership from 2690 shared to upgrade for the calling thread within the absolute timeout 2691 specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>. 2692 If <code class="computeroutput"><span class="identifier">abs_time</span></code> has 2693 already passed, the function attempts to obtain upgrade ownership 2694 without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code>). The function shall return before 2695 the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 2696 only if it has obtained upgrade ownership of the mutex object. 2697 For this conversion to be successful, there must be no thread holding 2698 upgrade ownership of this object at the moment of conversion. If 2699 the conversion is not successful, the shared ownership of the mutex 2700 is retained. 2701 </p></dd> 2702<dt><span class="term">Returns:</span></dt> 2703<dd><p> 2704 <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership 2705 was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2706 otherwise. 2707 </p></dd> 2708<dt><span class="term">Postcondition:</span></dt> 2709<dd><p> 2710 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2711 the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2712 </p></dd> 2713<dt><span class="term">Synchronization:</span></dt> 2714<dd><p> 2715 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations 2716 on the same object synchronize with this operation. 2717 </p></dd> 2718<dt><span class="term">Throws:</span></dt> 2719<dd><p> 2720 Nothing 2721 </p></dd> 2722<dt><span class="term">Notes:</span></dt> 2723<dd><p> 2724 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 2725 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2726 is defined on Windows platform 2727 </p></dd> 2728</dl> 2729</div> 2730</div> 2731<div class="section"> 2732<div class="titlepage"><div><div><h5 class="title"> 2733<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade" title="m.unlock_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_upgrade</span><span class="special">()</span></code></a> 2734</h5></div></div></div> 2735<div class="variablelist"> 2736<p class="title"><b></b></p> 2737<dl class="variablelist"> 2738<dt><span class="term">Precondition:</span></dt> 2739<dd><p> 2740 The current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2741 </p></dd> 2742<dt><span class="term">Effects:</span></dt> 2743<dd><p> 2744 Atomically releases exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code> 2745 by the current thread and acquires upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code> without blocking. 2746 </p></dd> 2747<dt><span class="term">Postcondition:</span></dt> 2748<dd><p> 2749 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2750 </p></dd> 2751<dt><span class="term">Synchronization:</span></dt> 2752<dd><p> 2753 This operation synchronizes with subsequent lock operations that 2754 obtain ownership of the same object. 2755 </p></dd> 2756<dt><span class="term">Throws:</span></dt> 2757<dd><p> 2758 Nothing 2759 </p></dd> 2760</dl> 2761</div> 2762</div> 2763<div class="section"> 2764<div class="titlepage"><div><div><h5 class="title"> 2765<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock" title="m.unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock</span><span class="special">()</span></code></a> 2766</h5></div></div></div> 2767<div class="variablelist"> 2768<p class="title"><b></b></p> 2769<dl class="variablelist"> 2770<dt><span class="term">Precondition:</span></dt> 2771<dd><p> 2772 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2773 </p></dd> 2774<dt><span class="term">Effects:</span></dt> 2775<dd><p> 2776 Atomically releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code> 2777 by the current thread and acquires exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. If any other threads have 2778 shared ownership, blocks until exclusive ownership can be acquired. 2779 </p></dd> 2780<dt><span class="term">Postcondition:</span></dt> 2781<dd><p> 2782 The current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2783 </p></dd> 2784<dt><span class="term">Synchronization:</span></dt> 2785<dd><p> 2786 This operation synchronizes with prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code> and subsequent lock operations 2787 that obtain ownership of the same object. 2788 </p></dd> 2789<dt><span class="term">Throws:</span></dt> 2790<dd><p> 2791 Nothing 2792 </p></dd> 2793</dl> 2794</div> 2795</div> 2796<div class="section"> 2797<div class="titlepage"><div><div><h5 class="title"> 2798<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">()</span></code></a> 2799</h5></div></div></div> 2800<div class="variablelist"> 2801<p class="title"><b></b></p> 2802<dl class="variablelist"> 2803<dt><span class="term">Precondition:</span></dt> 2804<dd><p> 2805 The calling thread shall hold an upgrade lock on the mutex. 2806 </p></dd> 2807<dt><span class="term">Effects:</span></dt> 2808<dd><p> 2809 The function attempts to atomically convert the ownership from 2810 upgrade to exclusive for the calling thread without blocking. For 2811 this conversion to be successful, this thread must be the only 2812 thread holding any ownership of the lock. If the conversion is 2813 not successful, the upgrade ownership of m is retained. 2814 </p></dd> 2815<dt><span class="term">Returns:</span></dt> 2816<dd><p> 2817 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive 2818 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2819 otherwise. 2820 </p></dd> 2821<dt><span class="term">Postcondition:</span></dt> 2822<dd><p> 2823 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2824 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2825 </p></dd> 2826<dt><span class="term">Synchronization:</span></dt> 2827<dd><p> 2828 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code> 2829 and subsequent lock operations on the same object synchronize with 2830 this operation. 2831 </p></dd> 2832<dt><span class="term">Throws:</span></dt> 2833<dd><p> 2834 Nothing 2835 </p></dd> 2836<dt><span class="term">Notes:</span></dt> 2837<dd><p> 2838 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2839 is defined on Windows platform 2840 </p></dd> 2841</dl> 2842</div> 2843</div> 2844<div class="section"> 2845<div class="titlepage"><div><div><h5 class="title"> 2846<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a> 2847</h5></div></div></div> 2848<div class="variablelist"> 2849<p class="title"><b></b></p> 2850<dl class="variablelist"> 2851<dt><span class="term">Precondition:</span></dt> 2852<dd><p> 2853 The calling thread shall hold an upgrade lock on the mutex. 2854 </p></dd> 2855<dt><span class="term">Effects:</span></dt> 2856<dd><p> 2857 If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code> 2858 is not exactly convertible to the native tick period, the duration 2859 shall be rounded up to the nearest native tick period. The function 2860 attempts to atomically convert the ownership from upgrade to exclusive 2861 for the calling thread within the relative timeout specified by 2862 <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the 2863 time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> 2864 is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain 2865 exclusive ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code>). The function shall return within 2866 the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> 2867 only if it has obtained exclusive ownership of the mutex object. 2868 For this conversion to be successful, this thread shall be the 2869 only thread holding any ownership of the lock at the moment of 2870 conversion. If the conversion is not successful, the upgrade ownership 2871 of m is retained. 2872 </p></dd> 2873<dt><span class="term">Returns:</span></dt> 2874<dd><p> 2875 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive 2876 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2877 otherwise. 2878 </p></dd> 2879<dt><span class="term">Postcondition:</span></dt> 2880<dd><p> 2881 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2882 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2883 </p></dd> 2884<dt><span class="term">Synchronization:</span></dt> 2885<dd><p> 2886 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code> 2887 and subsequent lock operations on the same object synchronize with 2888 this operation. 2889 </p></dd> 2890<dt><span class="term">Throws:</span></dt> 2891<dd><p> 2892 Nothing 2893 </p></dd> 2894<dt><span class="term">Notes:</span></dt> 2895<dd><p> 2896 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2897 is defined on Windows platform 2898 </p></dd> 2899</dl> 2900</div> 2901</div> 2902<div class="section"> 2903<div class="titlepage"><div><div><h5 class="title"> 2904<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until" title="m.try_unlock_upgrade_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a> 2905</h5></div></div></div> 2906<div class="variablelist"> 2907<p class="title"><b></b></p> 2908<dl class="variablelist"> 2909<dt><span class="term">Precondition:</span></dt> 2910<dd><p> 2911 The calling thread shall hold an upgrade lock on the mutex. 2912 </p></dd> 2913<dt><span class="term">Effects:</span></dt> 2914<dd><p> 2915 The function attempts to atomically convert the ownership from 2916 upgrade to exclusive for the calling thread within the absolute 2917 timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>. 2918 If <code class="computeroutput"><span class="identifier">abs_time</span></code> has 2919 already passed, the function attempts to obtain exclusive ownership 2920 without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code>). The function shall return before 2921 the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 2922 only if it has obtained exclusive ownership of the mutex object. 2923 For this conversion to be successful, this thread shall be the 2924 only thread holding any ownership of the lock at the moment of 2925 conversion. If the conversion is not successful, the upgrade ownership 2926 of m is retained. 2927 </p></dd> 2928<dt><span class="term">Returns:</span></dt> 2929<dd><p> 2930 <code class="computeroutput"><span class="keyword">true</span></code> if exclusive 2931 ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code> 2932 otherwise. 2933 </p></dd> 2934<dt><span class="term">Postcondition:</span></dt> 2935<dd><p> 2936 If the call returns <code class="computeroutput"><span class="keyword">true</span></code>, 2937 the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2938 </p></dd> 2939<dt><span class="term">Synchronization:</span></dt> 2940<dd><p> 2941 If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code> 2942 and subsequent lock operations on the same object synchronize with 2943 this operation. 2944 </p></dd> 2945<dt><span class="term">Throws:</span></dt> 2946<dd><p> 2947 Nothing 2948 </p></dd> 2949<dt><span class="term">Notes:</span></dt> 2950<dd><p> 2951 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 2952 is defined on Windows platform 2953 </p></dd> 2954</dl> 2955</div> 2956</div> 2957<div class="section"> 2958<div class="titlepage"><div><div><h5 class="title"> 2959<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared" title="m.unlock_upgrade_and_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">()</span></code></a> 2960</h5></div></div></div> 2961<div class="variablelist"> 2962<p class="title"><b></b></p> 2963<dl class="variablelist"> 2964<dt><span class="term">Precondition:</span></dt> 2965<dd><p> 2966 The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2967 </p></dd> 2968<dt><span class="term">Effects:</span></dt> 2969<dd><p> 2970 Atomically releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code> 2971 by the current thread and acquires shared ownership of <code class="computeroutput"><span class="identifier">m</span></code> without blocking. 2972 </p></dd> 2973<dt><span class="term">Postcondition:</span></dt> 2974<dd><p> 2975 The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>. 2976 </p></dd> 2977<dt><span class="term">Synchronization:</span></dt> 2978<dd><p> 2979 This operation synchronizes with prior <code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code> and subsequent lock operations 2980 that obtain ownership of the same object. 2981 </p></dd> 2982<dt><span class="term">Throws:</span></dt> 2983<dd><p> 2984 Nothing 2985 </p></dd> 2986</dl> 2987</div> 2988</div> 2989</div> 2990</div> 2991<div class="section"> 2992<div class="titlepage"><div><div><h3 class="title"> 2993<a name="thread.synchronization.lock_option"></a><a class="link" href="synchronization.html#thread.synchronization.lock_option" title="Lock Options">Lock Options</a> 2994</h3></div></div></div> 2995<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_option.lock_tags">Lock 2996 option tags</a></span></dt></dl></div> 2997<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp> </span> 2998<span class="comment">// #include <boost/thread/locks_options.hpp> </span> 2999 3000<span class="keyword">namespace</span> <span class="identifier">boost</span> 3001<span class="special">{</span> 3002 <span class="keyword">struct</span> <span class="identifier">defer_lock_t</span> <span class="special">{};</span> 3003 <span class="keyword">struct</span> <span class="identifier">try_to_lock_t</span> <span class="special">{};</span> 3004 <span class="keyword">struct</span> <span class="identifier">adopt_lock_t</span> <span class="special">{};</span> 3005 <span class="keyword">constexpr</span> <span class="identifier">defer_lock_t</span> <span class="identifier">defer_lock</span><span class="special">;</span> 3006 <span class="keyword">constexpr</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">try_to_lock</span><span class="special">;</span> 3007 <span class="keyword">constexpr</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">adopt_lock</span><span class="special">;</span> 3008</pre> 3009<div class="section"> 3010<div class="titlepage"><div><div><h4 class="title"> 3011<a name="thread.synchronization.lock_option.lock_tags"></a><a class="link" href="synchronization.html#thread.synchronization.lock_option.lock_tags" title="Lock option tags">Lock 3012 option tags</a> 3013</h4></div></div></div> 3014<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">locks</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3015<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">locks_options</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3016 3017<span class="keyword">struct</span> <span class="identifier">defer_lock_t</span> <span class="special">{};</span> 3018<span class="keyword">struct</span> <span class="identifier">try_to_lock_t</span> <span class="special">{};</span> 3019<span class="keyword">struct</span> <span class="identifier">adopt_lock_t</span> <span class="special">{};</span> 3020<span class="keyword">const</span> <span class="identifier">defer_lock_t</span> <span class="identifier">defer_lock</span><span class="special">;</span> 3021<span class="keyword">const</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">try_to_lock</span><span class="special">;</span> 3022<span class="keyword">const</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">adopt_lock</span><span class="special">;</span> 3023</pre> 3024<p> 3025 These tags are used in scoped locks constructors to specify a specific 3026 behavior. 3027 </p> 3028<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 3029<li class="listitem"> 3030 <code class="computeroutput"><span class="identifier">defer_lock_t</span></code>: is used 3031 to construct the scoped lock without locking it. 3032 </li> 3033<li class="listitem"> 3034 <code class="computeroutput"><span class="identifier">try_to_lock_t</span></code>: is used 3035 to construct the scoped lock trying to lock it. 3036 </li> 3037<li class="listitem"> 3038 <code class="computeroutput"><span class="identifier">adopt_lock_t</span></code>: is used 3039 to construct the scoped lock without locking it but adopting ownership. 3040 </li> 3041</ul></div> 3042</div> 3043</div> 3044<div class="section"> 3045<div class="titlepage"><div><div><h3 class="title"> 3046<a name="thread.synchronization.lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard" title="Lock Guard">Lock Guard</a> 3047</h3></div></div></div> 3048<div class="toc"><dl class="toc"> 3049<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard">Class 3050 template <code class="computeroutput"><span class="identifier">lock_guard</span></code></a></span></dt> 3051<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard">Non 3052 Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a></span></dt> 3053<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard_adopt">Non 3054 Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a></span></dt> 3055</dl></div> 3056<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp> </span> 3057<span class="comment">// #include <boost/thread/lock_guard.hpp> </span> 3058 3059<span class="keyword">namespace</span> <span class="identifier">boost</span> 3060<span class="special">{</span> 3061 3062 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3063 <span class="keyword">class</span> <span class="identifier">lock_guard</span> 3064<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_LOCK_GUARD</span> 3065 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3066 <span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 3067 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3068 <span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 3069<span class="preprocessor">#endif</span> 3070<span class="special">}</span> 3071</pre> 3072<div class="section"> 3073<div class="titlepage"><div><div><h4 class="title"> 3074<a name="thread.synchronization.lock_guard.lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard">Class 3075 template <code class="computeroutput"><span class="identifier">lock_guard</span></code></a> 3076</h4></div></div></div> 3077<div class="toc"><dl class="toc"> 3078<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3079 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt> 3080<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3081 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt> 3082<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">lock_guard</span><span class="special">()</span></code></a></span></dt> 3083</dl></div> 3084<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span> 3085<span class="comment">// #include <boost/thread/lock_guard.hpp> </span> 3086 3087<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3088<span class="keyword">class</span> <span class="identifier">lock_guard</span> 3089<span class="special">{</span> 3090<span class="keyword">public</span><span class="special">:</span> 3091 <span class="keyword">explicit</span> <span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span> 3092 <span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">);</span> 3093 3094 <span class="special">~</span><span class="identifier">lock_guard</span><span class="special">();</span> 3095<span class="special">};</span> 3096</pre> 3097<p> 3098 <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a> is very simple: on 3099 construction it acquires ownership of the implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> supplied as the 3100 constructor parameter. On destruction, the ownership is released. This 3101 provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, to facilitate 3102 exception-safe locking and unlocking. In addition, the <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt" title="lock_guard(Lockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3103 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code> 3104 constructor</a> allows the <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a> object to take ownership 3105 of a lock already held by the current thread. 3106 </p> 3107<div class="section"> 3108<div class="titlepage"><div><div><h5 class="title"> 3109<a name="thread.synchronization.lock_guard.lock_guard.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor" title="lock_guard(Lockable & m)"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3110 <span class="identifier">m</span><span class="special">)</span></code></a> 3111</h5></div></div></div> 3112<div class="variablelist"> 3113<p class="title"><b></b></p> 3114<dl class="variablelist"> 3115<dt><span class="term">Effects:</span></dt> 3116<dd><p> 3117 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3118 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 3119 </p></dd> 3120<dt><span class="term">Throws:</span></dt> 3121<dd><p> 3122 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 3123 </p></dd> 3124</dl> 3125</div> 3126</div> 3127<div class="section"> 3128<div class="titlepage"><div><div><h5 class="title"> 3129<a name="thread.synchronization.lock_guard.lock_guard.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt" title="lock_guard(Lockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3130 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a> 3131</h5></div></div></div> 3132<div class="variablelist"> 3133<p class="title"><b></b></p> 3134<dl class="variablelist"> 3135<dt><span class="term">Precondition:</span></dt> 3136<dd><p> 3137 The current thread owns a lock on <code class="computeroutput"><span class="identifier">m</span></code> 3138 equivalent to one obtained by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 3139 </p></dd> 3140<dt><span class="term">Effects:</span></dt> 3141<dd><p> 3142 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3143 Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>. 3144 </p></dd> 3145<dt><span class="term">Throws:</span></dt> 3146<dd><p> 3147 Nothing. 3148 </p></dd> 3149</dl> 3150</div> 3151</div> 3152<div class="section"> 3153<div class="titlepage"><div><div><h5 class="title"> 3154<a name="thread.synchronization.lock_guard.lock_guard.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.destructor" title="~lock_guard()"><code class="computeroutput"><span class="special">~</span><span class="identifier">lock_guard</span><span class="special">()</span></code></a> 3155</h5></div></div></div> 3156<div class="variablelist"> 3157<p class="title"><b></b></p> 3158<dl class="variablelist"> 3159<dt><span class="term">Effects:</span></dt> 3160<dd><p> 3161 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a> 3162 on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed 3163 to the constructor. 3164 </p></dd> 3165<dt><span class="term">Throws:</span></dt> 3166<dd><p> 3167 Nothing. 3168 </p></dd> 3169</dl> 3170</div> 3171</div> 3172</div> 3173<div class="section"> 3174<div class="titlepage"><div><div><h4 class="title"> 3175<a name="thread.synchronization.lock_guard.make_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard" title="Non Member Function make_lock_guard">Non 3176 Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a> 3177</h4></div></div></div> 3178<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3179<span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 3180</pre> 3181<div class="variablelist"> 3182<p class="title"><b></b></p> 3183<dl class="variablelist"> 3184<dt><span class="term">Returns:</span></dt> 3185<dd><p> 3186 a lock_guard as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">}</span></code>. 3187 </p></dd> 3188<dt><span class="term">Throws:</span></dt> 3189<dd><p> 3190 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 3191 </p></dd> 3192</dl> 3193</div> 3194</div> 3195<div class="section"> 3196<div class="titlepage"><div><div><h4 class="title"> 3197<a name="thread.synchronization.lock_guard.make_lock_guard_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard_adopt" title="Non Member Function make_lock_guard">Non 3198 Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a> 3199</h4></div></div></div> 3200<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3201<span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 3202</pre> 3203<div class="variablelist"> 3204<p class="title"><b></b></p> 3205<dl class="variablelist"> 3206<dt><span class="term">Returns:</span></dt> 3207<dd><p> 3208 a lock_guard as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock</span><span class="special">}</span></code>. 3209 </p></dd> 3210<dt><span class="term">Throws:</span></dt> 3211<dd><p> 3212 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 3213 </p></dd> 3214</dl> 3215</div> 3216</div> 3217</div> 3218<div class="section"> 3219<div class="titlepage"><div><div><h3 class="title"> 3220<a name="thread.synchronization.with_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.with_lock_guard" title="With Lock Guard">With Lock Guard</a> 3221</h3></div></div></div> 3222<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.with_lock_guard.with_lock_guard">Non 3223 Member Function <code class="computeroutput"><span class="identifier">with_lock_guard</span></code></a></span></dt></dl></div> 3224<pre class="programlisting"><span class="comment">// #include <boost/thread/with_lock_guard.hpp></span> 3225 3226<span class="keyword">namespace</span> <span class="identifier">boost</span> 3227<span class="special">{</span> 3228 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span> 3229 <span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">)</span> <span class="special">-></span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...));</span> 3230<span class="special">}</span> 3231</pre> 3232<div class="section"> 3233<div class="titlepage"><div><div><h4 class="title"> 3234<a name="thread.synchronization.with_lock_guard.with_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.with_lock_guard.with_lock_guard" title="Non Member Function with_lock_guard">Non 3235 Member Function <code class="computeroutput"><span class="identifier">with_lock_guard</span></code></a> 3236</h4></div></div></div> 3237<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span> 3238<span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span> 3239 <span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> 3240 <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">,</span> 3241 <span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span> 3242<span class="special">)</span> <span class="special">-></span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...));</span> 3243</pre> 3244<div class="variablelist"> 3245<p class="title"><b></b></p> 3246<dl class="variablelist"> 3247<dt><span class="term">Precondition:</span></dt> 3248<dd><p> 3249 <code class="computeroutput"><span class="identifier">m</span></code> must be in unlocked 3250 state 3251 </p></dd> 3252<dt><span class="term">Effects:</span></dt> 3253<dd><p> 3254 call <code class="computeroutput"><span class="identifier">func</span></code> in scope 3255 locked by <code class="computeroutput"><span class="identifier">m</span></code> 3256 </p></dd> 3257<dt><span class="term">Returns:</span></dt> 3258<dd><p> 3259 Result of <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">args</span><span class="special">...)</span></code> 3260 call 3261 </p></dd> 3262<dt><span class="term">Throws:</span></dt> 3263<dd><p> 3264 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span></code> 3265 and <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">args</span><span class="special">...)</span></code> 3266 </p></dd> 3267<dt><span class="term">Postcondition:</span></dt> 3268<dd><p> 3269 <code class="computeroutput"><span class="identifier">m</span></code> is in unlocked 3270 state 3271 </p></dd> 3272<dt><span class="term">Limitations:</span></dt> 3273<dd><p> 3274 Without c++11 variadic templates support number of arguments is limited 3275 to <code class="computeroutput"><span class="number">4</span></code> 3276 </p></dd> 3277<dt><span class="term"></span></dt> 3278<dd><p> 3279 Without rvalue references support calling class method with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code> must be const 3280 </p></dd> 3281<dt><span class="term"></span></dt> 3282<dd><p> 3283 For correct work with lambda macro <code class="computeroutput"><span class="identifier">BOOST_RESULT_OF_USE_DECLTYPE</span></code> 3284 may be needed to define 3285 </p></dd> 3286</dl> 3287</div> 3288</div> 3289</div> 3290<div class="section"> 3291<div class="titlepage"><div><div><h3 class="title"> 3292<a name="thread.synchronization.lock_concepts"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts" title="Lock Concepts">Lock Concepts</a> 3293</h3></div></div></div> 3294<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock">StrictLock 3295 -- EXTENSION</a></span></dt></dl></div> 3296<div class="section"> 3297<div class="titlepage"><div><div><h4 class="title"> 3298<a name="thread.synchronization.lock_concepts.StrictLock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION">StrictLock 3299 -- EXTENSION</a> 3300</h4></div></div></div> 3301<div class="toc"><dl class="toc"> 3302<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.mutex_type"><code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code></a></span></dt> 3303<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole"><code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">L</span><span class="special">></span></code></a></span></dt> 3304<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.owns_lock"><code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code></a></span></dt> 3305<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.models">Models</a></span></dt> 3306</dl></div> 3307<pre class="programlisting"><span class="comment">// #include <boost/thread/lock_concepts.hpp> </span> 3308 3309<span class="keyword">namespace</span> <span class="identifier">boost</span> 3310<span class="special">{</span> 3311 3312 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span> 3313 <span class="keyword">class</span> <span class="identifier">StrictLock</span><span class="special">;</span> 3314<span class="special">}</span> 3315</pre> 3316<p> 3317 A StrictLock is a lock that ensures that the associated mutex is locked 3318 during the lifetime of the lock. 3319 </p> 3320<p> 3321 A type <code class="computeroutput"><span class="identifier">L</span></code> meets the StrictLock 3322 requirements if the following expressions are well-formed and have the 3323 specified semantics 3324 </p> 3325<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 3326<li class="listitem"> 3327 <code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code> 3328 </li> 3329<li class="listitem"> 3330 <code class="computeroutput"><span class="identifier">is_strict_lock</span><span class="special"><</span><span class="identifier">L</span><span class="special">></span></code> 3331 </li> 3332<li class="listitem"> 3333 <code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code> 3334 </li> 3335</ul></div> 3336<p> 3337 and BasicLockable<L::mutex_type> 3338 </p> 3339<p> 3340 where 3341 </p> 3342<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 3343<li class="listitem"> 3344 <code class="computeroutput"><span class="identifier">cl</span></code> denotes a value 3345 of type <code class="computeroutput"><span class="identifier">L</span> <span class="keyword">const</span><span class="special">&</span></code>, 3346 </li> 3347<li class="listitem"> 3348 <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of 3349 type <code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span></code>, 3350 </li> 3351</ul></div> 3352<div class="section"> 3353<div class="titlepage"><div><div><h5 class="title"> 3354<a name="thread.synchronization.lock_concepts.StrictLock.mutex_type"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.mutex_type" title="L::mutex_type"><code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code></a> 3355</h5></div></div></div> 3356<p> 3357 The type L::mutex_type denotes the mutex that is locked by this lock. 3358 </p> 3359</div> 3360<div class="section"> 3361<div class="titlepage"><div><div><h5 class="title"> 3362<a name="thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole" title="is_strict_lock_sur_parole<L>"><code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">L</span><span class="special">></span></code></a> 3363</h5></div></div></div> 3364<p> 3365 As the semantic "ensures that the associated mutex is locked during 3366 the lifetime of the lock. " can not be described by syntactic requirements 3367 a <code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span></code> 3368 trait must be specialized by the user defining the lock so that the following 3369 assertion is true: 3370 </p> 3371<pre class="programlisting"><span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">L</span><span class="special">>::</span><span class="identifier">value</span> <span class="special">==</span> <span class="keyword">true</span> 3372</pre> 3373</div> 3374<div class="section"> 3375<div class="titlepage"><div><div><h5 class="title"> 3376<a name="thread.synchronization.lock_concepts.StrictLock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.owns_lock" title="cl.owns_lock(m);"><code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code></a> 3377</h5></div></div></div> 3378<div class="variablelist"> 3379<p class="title"><b></b></p> 3380<dl class="variablelist"> 3381<dt><span class="term">Return Type:</span></dt> 3382<dd><p> 3383 <code class="computeroutput"><span class="keyword">bool</span></code> 3384 </p></dd> 3385<dt><span class="term">Returns:</span></dt> 3386<dd><p> 3387 Whether the strict lock is locking the mutex <code class="computeroutput"><span class="identifier">m</span></code> 3388 </p></dd> 3389<dt><span class="term">Throws:</span></dt> 3390<dd><p> 3391 Nothing. 3392 </p></dd> 3393</dl> 3394</div> 3395</div> 3396<div class="section"> 3397<div class="titlepage"><div><div><h5 class="title"> 3398<a name="thread.synchronization.lock_concepts.StrictLock.models"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.models" title="Models">Models</a> 3399</h5></div></div></div> 3400<p> 3401 The following classes are models of <code class="computeroutput"><span class="identifier">StrictLock</span></code>: 3402 </p> 3403<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 3404<li class="listitem"> 3405 strict_lock: ensured by construction, 3406 </li> 3407<li class="listitem"> 3408 nested_strict_lock: "sur parole" as the user could use 3409 adopt_lock_t on unique_lock constructor overload without having locked 3410 the mutex, 3411 </li> 3412<li class="listitem"> 3413 <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>: "sur parole" 3414 as the user could use adopt_lock_t constructor overload without having 3415 locked the mutex. 3416 </li> 3417</ul></div> 3418</div> 3419</div> 3420</div> 3421<div class="section"> 3422<div class="titlepage"><div><div><h3 class="title"> 3423<a name="thread.synchronization.locks"></a><a class="link" href="synchronization.html#thread.synchronization.locks" title="Lock Types">Lock Types</a> 3424</h3></div></div></div> 3425<div class="toc"><dl class="toc"> 3426<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock">Class template 3427 <code class="computeroutput"><span class="identifier">unique_lock</span></code></a></span></dt> 3428<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock">Class template 3429 <code class="computeroutput"><span class="identifier">shared_lock</span></code> - C++14</a></span></dt> 3430<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.upgrade_lock">Class template 3431 <code class="computeroutput"><span class="identifier">upgrade_lock</span></code> - EXTENSION</a></span></dt> 3432<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock">Class 3433 template <code class="computeroutput"><span class="identifier">upgrade_to_unique_lock</span></code> 3434 -- EXTENSION</a></span></dt> 3435<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.scoped_try_lock">Mutex-specific 3436 class <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> -- 3437 DEPRECATED</a></span></dt> 3438</dl></div> 3439<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp> </span> 3440<span class="comment">// #include <boost/thread/lock_types.hpp> </span> 3441 3442<span class="keyword">namespace</span> <span class="identifier">boost</span> 3443<span class="special">{</span> 3444 3445 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3446 <span class="keyword">class</span> <span class="identifier">unique_lock</span><span class="special">;</span> 3447 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">></span> 3448 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">unique_lock</span> <span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">unique_lock</span> <span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">rhs</span><span class="special">);</span> 3449 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3450 <span class="keyword">class</span> <span class="identifier">shared_lock</span><span class="special">;</span> <span class="comment">// C++14</span> 3451 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">></span> 3452 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">lhs</span><span class="special">,</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// C++14</span> 3453 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3454 <span class="keyword">class</span> <span class="identifier">upgrade_lock</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 3455 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">></span> 3456 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_lock</span> <span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">upgrade_lock</span> <span class="special"><</span><span class="identifier">Mutex</span><span class="special">>&</span> <span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 3457 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Mutex</span><span class="special">></span> 3458 <span class="keyword">class</span> <span class="identifier">upgrade_to_unique_lock</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 3459<span class="special">}</span> 3460</pre> 3461<div class="section"> 3462<div class="titlepage"><div><div><h4 class="title"> 3463<a name="thread.synchronization.locks.unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock">Class template 3464 <code class="computeroutput"><span class="identifier">unique_lock</span></code></a> 3465</h4></div></div></div> 3466<div class="toc"><dl class="toc"> 3467<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.defaultconstructor"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">()</span></code></a></span></dt> 3468<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3469 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt> 3470<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_adopt"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3471 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt> 3472<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_defer"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3473 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a></span></dt> 3474<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_try"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3475 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt> 3476<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_try"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> 3477 <span class="identifier">sl</span><span class="special">,</span> 3478 <span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt> 3479<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_until"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&,</span> 3480 <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></code></a></span></dt> 3481<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_for"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&,</span> 3482 <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></code></a></span></dt> 3483<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_abs_time"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3484 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</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></code></a></span></dt> 3485<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_time_point"><code class="computeroutput"><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> 3486 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3487 <span class="identifier">m</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></code></a></span></dt> 3488<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_duration"><code class="computeroutput"><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> 3489 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3490 <span class="identifier">m</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">abs_time</span><span class="special">)</span></code></a></span></dt> 3491<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">unique_lock</span><span class="special">()</span></code></a></span></dt> 3492<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt> 3493<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.mutex"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a></span></dt> 3494<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.explicit_bool_conversion"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span> 3495 <span class="keyword">bool</span><span class="special">()</span> 3496 <span class="keyword">const</span></code></a></span></dt> 3497<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.release"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a></span></dt> 3498</dl></div> 3499<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span> 3500<span class="comment">// #include <boost/thread/lock_types.hpp> </span> 3501 3502<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 3503<span class="keyword">class</span> <span class="identifier">unique_lock</span> 3504<span class="special">{</span> 3505<span class="keyword">public</span><span class="special">:</span> 3506 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span> 3507 <span class="identifier">unique_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 3508 <span class="keyword">explicit</span> <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span> 3509 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span> 3510 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_lock_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 3511 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span> 3512 3513<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span> 3514 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span> <span class="comment">// C++14 </span> 3515 <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> 3516 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> 3517 <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="comment">// C++14</span> 3518 <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> 3519 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> 3520 <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">// C++14</span> 3521<span class="preprocessor">#endif</span> 3522 3523 <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> 3524 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&</span> <span class="identifier">mtx</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> 3525 <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> 3526 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&</span> <span class="identifier">mtx</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">d</span><span class="special">);</span> 3527 <span class="special">~</span><span class="identifier">unique_lock</span><span class="special">();</span> 3528 3529 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">unique_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 3530 <span class="identifier">unique_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">unique_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 3531 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 3532 <span class="keyword">explicit</span> <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 3533 3534 <span class="identifier">unique_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 3535 3536 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 3537 <span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 3538 3539 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 3540 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 3541 3542 <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> 3543 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 3544 <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> 3545 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 3546 3547 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 3548 3549 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 3550 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 3551 3552 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 3553 3554<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USE_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span> 3555 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">target_time</span><span class="special">);</span> 3556 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span> 3557 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">relative_time</span><span class="special">);</span> 3558 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">absolute_time</span><span class="special">);</span> 3559<span class="preprocessor">#endif</span> 3560 3561<span class="special">};</span> 3562</pre> 3563<p> 3564 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is more complex than 3565 <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>: not only does it provide 3566 for RAII-style locking, it also allows for deferring acquiring the lock 3567 until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 3568 member function is called explicitly, or trying to acquire the lock in 3569 a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 3570 is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise 3571 adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. 3572 </p> 3573<p> 3574 Specializations of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> model the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> concept if the supplied 3575 <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models 3576 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> concept (e.g. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span><span class="special">></span></code>), 3577 or the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> concept if the supplied 3578 <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models 3579 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> concept (e.g. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span></code>), 3580 or the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept if the supplied 3581 <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models 3582 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept. 3583 </p> 3584<p> 3585 An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span> 3586 the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code> 3587 if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3588 returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code> 3589 and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3590 returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object 3591 that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed, 3592 then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">unlock</span><span class="special">()</span></code></a>. 3593 </p> 3594<p> 3595 The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> are not thread-safe. 3596 In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is intended to model 3597 the ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object by a particular 3598 thread, and the member functions that release ownership of the lock state 3599 (including the destructor) must be called by the same thread that acquired 3600 ownership of the lock state. 3601 </p> 3602<div class="section"> 3603<div class="titlepage"><div><div><h5 class="title"> 3604<a name="thread.synchronization.locks.unique_lock.defaultconstructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.defaultconstructor" title="unique_lock()"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">()</span></code></a> 3605</h5></div></div></div> 3606<div class="variablelist"> 3607<p class="title"><b></b></p> 3608<dl class="variablelist"> 3609<dt><span class="term">Effects:</span></dt> 3610<dd><p> 3611 Creates a lock object with no associated mutex. 3612 </p></dd> 3613<dt><span class="term">Postcondition:</span></dt> 3614<dd><p> 3615 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3616 returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3617 returns <code class="computeroutput"><span class="identifier">NULL</span></code>. 3618 </p></dd> 3619<dt><span class="term">Throws:</span></dt> 3620<dd><p> 3621 Nothing. 3622 </p></dd> 3623</dl> 3624</div> 3625</div> 3626<div class="section"> 3627<div class="titlepage"><div><div><h5 class="title"> 3628<a name="thread.synchronization.locks.unique_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor" title="unique_lock(Lockable & m)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3629 <span class="identifier">m</span><span class="special">)</span></code></a> 3630</h5></div></div></div> 3631<div class="variablelist"> 3632<p class="title"><b></b></p> 3633<dl class="variablelist"> 3634<dt><span class="term">Effects:</span></dt> 3635<dd><p> 3636 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3637 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 3638 </p></dd> 3639<dt><span class="term">Postcondition:</span></dt> 3640<dd><p> 3641 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3642 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3643 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 3644 </p></dd> 3645<dt><span class="term">Throws:</span></dt> 3646<dd><p> 3647 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 3648 </p></dd> 3649</dl> 3650</div> 3651</div> 3652<div class="section"> 3653<div class="titlepage"><div><div><h5 class="title"> 3654<a name="thread.synchronization.locks.unique_lock.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_adopt" title="unique_lock(Lockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3655 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a> 3656</h5></div></div></div> 3657<div class="variablelist"> 3658<p class="title"><b></b></p> 3659<dl class="variablelist"> 3660<dt><span class="term">Precondition:</span></dt> 3661<dd><p> 3662 The current thread owns an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>. 3663 </p></dd> 3664<dt><span class="term">Effects:</span></dt> 3665<dd><p> 3666 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3667 Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>. 3668 </p></dd> 3669<dt><span class="term">Postcondition:</span></dt> 3670<dd><p> 3671 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3672 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3673 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 3674 </p></dd> 3675<dt><span class="term">Throws:</span></dt> 3676<dd><p> 3677 Nothing. 3678 </p></dd> 3679</dl> 3680</div> 3681</div> 3682<div class="section"> 3683<div class="titlepage"><div><div><h5 class="title"> 3684<a name="thread.synchronization.locks.unique_lock.constructor_defer"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_defer" title="unique_lock(Lockable & m,boost::defer_lock_t)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3685 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a> 3686</h5></div></div></div> 3687<div class="variablelist"> 3688<p class="title"><b></b></p> 3689<dl class="variablelist"> 3690<dt><span class="term">Effects:</span></dt> 3691<dd><p> 3692 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3693 </p></dd> 3694<dt><span class="term">Postcondition:</span></dt> 3695<dd><p> 3696 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3697 returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3698 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 3699 </p></dd> 3700<dt><span class="term">Throws:</span></dt> 3701<dd><p> 3702 Nothing. 3703 </p></dd> 3704</dl> 3705</div> 3706</div> 3707<div class="section"> 3708<div class="titlepage"><div><div><h5 class="title"> 3709<a name="thread.synchronization.locks.unique_lock.constructor_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_try" title="unique_lock(Lockable & m,boost::try_to_lock_t)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3710 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a> 3711</h5></div></div></div> 3712<div class="variablelist"> 3713<p class="title"><b></b></p> 3714<dl class="variablelist"> 3715<dt><span class="term">Effects:</span></dt> 3716<dd><p> 3717 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3718 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a>, 3719 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>. 3720 </p></dd> 3721<dt><span class="term">Postcondition:</span></dt> 3722<dd><p> 3723 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3724 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 3725 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 3726 returned <code class="computeroutput"><span class="keyword">true</span></code>, then 3727 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3728 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise 3729 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3730 returns <code class="computeroutput"><span class="keyword">false</span></code>. 3731 </p></dd> 3732<dt><span class="term">Throws:</span></dt> 3733<dd><p> 3734 Nothing. 3735 </p></dd> 3736</dl> 3737</div> 3738</div> 3739<div class="section"> 3740<div class="titlepage"><div><div><h5 class="title"> 3741<a name="thread.synchronization.locks.unique_lock.constructor_sh_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_try" title="unique_lock(shared_lock<mutex_type>&& sl, try_to_lock_t)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> 3742 <span class="identifier">sl</span><span class="special">,</span> 3743 <span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a> 3744</h5></div></div></div> 3745<div class="variablelist"> 3746<p class="title"><b></b></p> 3747<dl class="variablelist"> 3748<dt><span class="term">Requires:</span></dt> 3749<dd><p> 3750 The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code> 3751 type must implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">()</span></code>. 3752 </p></dd> 3753<dt><span class="term">Effects:</span></dt> 3754<dd><p> 3755 Constructs an object of type <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>. Let <code class="computeroutput"><span class="identifier">pm</span></code> be the pointer to the mutex 3756 and <code class="computeroutput"><span class="identifier">owns</span></code> the ownership 3757 state. Initializes <code class="computeroutput"><span class="identifier">pm</span></code> 3758 with nullptr and <code class="computeroutput"><span class="identifier">owns</span></code> 3759 with false. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>, 3760 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the 3761 return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>, 3762 and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>, 3763 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the 3764 value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code> 3765 to <code class="computeroutput"><span class="keyword">true</span></code>. 3766 </p></dd> 3767<dt><span class="term">Note:</span></dt> 3768<dd><p> 3769 If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code> 3770 returns <code class="computeroutput"><span class="keyword">true</span></code> and 3771 <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code> 3772 returns <code class="computeroutput"><span class="keyword">false</span></code>, <code class="computeroutput"><span class="identifier">sl</span></code> is not modified. 3773 </p></dd> 3774<dt><span class="term">Throws:</span></dt> 3775<dd><p> 3776 Nothing. 3777 </p></dd> 3778<dt><span class="term">Notes:</span></dt> 3779<dd><p> 3780 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 3781 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 3782 is defined on Windows platform 3783 </p></dd> 3784</dl> 3785</div> 3786</div> 3787<div class="section"> 3788<div class="titlepage"><div><div><h5 class="title"> 3789<a name="thread.synchronization.locks.unique_lock.constructor_sh_until"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_until" title="unique_lock(shared_lock<mutex_type>&&, const chrono::time_point<Clock, Duration>&)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&,</span> 3790 <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></code></a> 3791</h5></div></div></div> 3792<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> 3793<span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> 3794 <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> 3795</pre> 3796<div class="variablelist"> 3797<p class="title"><b></b></p> 3798<dl class="variablelist"> 3799<dt><span class="term">Requires:</span></dt> 3800<dd><p> 3801 The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code> 3802 type shall implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>. 3803 </p></dd> 3804<dt><span class="term">Effects:</span></dt> 3805<dd><p> 3806 Constructs an object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a></code>, initializing 3807 <code class="computeroutput"><span class="identifier">pm</span></code> with <code class="computeroutput"><span class="keyword">nullptr</span></code> and <code class="computeroutput"><span class="identifier">owns</span></code> 3808 with <code class="computeroutput"><span class="keyword">false</span></code>. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> 3809 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>, 3810 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the 3811 return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>, 3812 and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>, 3813 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the 3814 value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code> 3815 to <code class="computeroutput"><span class="keyword">true</span></code>. 3816 </p></dd> 3817<dt><span class="term">Note:</span></dt> 3818<dd><p> 3819 If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code> 3820 returns <code class="computeroutput"><span class="keyword">true</span></code> and 3821 <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span> 3822 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>, 3823 <code class="computeroutput"><span class="identifier">sl</span></code> is not modified. 3824 </p></dd> 3825<dt><span class="term">Throws:</span></dt> 3826<dd><p> 3827 Nothing. 3828 </p></dd> 3829<dt><span class="term">Notes:</span></dt> 3830<dd><p> 3831 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 3832 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 3833 is defined on Windows platform 3834 </p></dd> 3835</dl> 3836</div> 3837</div> 3838<div class="section"> 3839<div class="titlepage"><div><div><h5 class="title"> 3840<a name="thread.synchronization.locks.unique_lock.constructor_sh_for"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_for" title="unique_lock(shared_lock<mutex_type>&&, const chrono::duration<Rep, Period>&)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&,</span> 3841 <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></code></a> 3842</h5></div></div></div> 3843<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> 3844<span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> 3845 <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> 3846</pre> 3847<div class="variablelist"> 3848<p class="title"><b></b></p> 3849<dl class="variablelist"> 3850<dt><span class="term">Requires:</span></dt> 3851<dd><p> 3852 The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code> 3853 type shall implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>. 3854 </p></dd> 3855<dt><span class="term">Effects:</span></dt> 3856<dd><p> 3857 Constructs an object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a></code>, initializing 3858 <code class="computeroutput"><span class="identifier">pm</span></code> with <code class="computeroutput"><span class="keyword">nullptr</span></code> and <code class="computeroutput"><span class="identifier">owns</span></code> 3859 with <code class="computeroutput"><span class="keyword">false</span></code>. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> 3860 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>, 3861 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the 3862 return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>, 3863 and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span> <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>, 3864 sets <code class="computeroutput"><span class="identifier">pm</span></code> to the 3865 value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code> 3866 to <code class="computeroutput"><span class="keyword">true</span></code>. 3867 </p></dd> 3868<dt><span class="term">Note:</span></dt> 3869<dd><p> 3870 If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code> 3871 returns <code class="computeroutput"><span class="keyword">true</span></code> and 3872 <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-></span> 3873 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>, 3874 <code class="computeroutput"><span class="identifier">sl</span></code> is not modified. 3875 </p></dd> 3876<dt><span class="term">Postcondition:</span></dt> 3877<dd><p> 3878 . 3879 </p></dd> 3880<dt><span class="term">Throws:</span></dt> 3881<dd><p> 3882 Nothing. 3883 </p></dd> 3884<dt><span class="term">Notes:</span></dt> 3885<dd><p> 3886 Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code> 3887 and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code> 3888 is defined on Windows platform 3889 </p></dd> 3890</dl> 3891</div> 3892</div> 3893<div class="section"> 3894<div class="titlepage"><div><div><h5 class="title"> 3895<a name="thread.synchronization.locks.unique_lock.constructor_abs_time"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_abs_time" title="unique_lock(Lockable & m,boost::system_time const& abs_time)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3896 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</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></code></a> 3897</h5></div></div></div> 3898<div class="variablelist"> 3899<p class="title"><b></b></p> 3900<dl class="variablelist"> 3901<dt><span class="term">Effects:</span></dt> 3902<dd><p> 3903 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3904 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>, 3905 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>. 3906 </p></dd> 3907<dt><span class="term">Postcondition:</span></dt> 3908<dd><p> 3909 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3910 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 3911 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a> 3912 returned <code class="computeroutput"><span class="keyword">true</span></code>, then 3913 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3914 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise 3915 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3916 returns <code class="computeroutput"><span class="keyword">false</span></code>. 3917 </p></dd> 3918<dt><span class="term">Throws:</span></dt> 3919<dd><p> 3920 Any exceptions thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>. 3921 </p></dd> 3922</dl> 3923</div> 3924</div> 3925<div class="section"> 3926<div class="titlepage"><div><div><h5 class="title"> 3927<a name="thread.synchronization.locks.unique_lock.constructor_time_point"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_time_point" title="template <class Clock, class Duration> unique_lock(Lockable & m,const chrono::time_point<Clock, Duration>& abs_time)"><code class="computeroutput"><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> 3928 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3929 <span class="identifier">m</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></code></a> 3930</h5></div></div></div> 3931<div class="variablelist"> 3932<p class="title"><b></b></p> 3933<dl class="variablelist"> 3934<dt><span class="term">Effects:</span></dt> 3935<dd><p> 3936 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3937 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>, and takes ownership of the lock 3938 state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>. 3939 </p></dd> 3940<dt><span class="term">Postcondition:</span></dt> 3941<dd><p> 3942 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3943 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 3944 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a> returned 3945 <code class="computeroutput"><span class="keyword">true</span></code>, then <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3946 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise 3947 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3948 returns <code class="computeroutput"><span class="keyword">false</span></code>. 3949 </p></dd> 3950<dt><span class="term">Throws:</span></dt> 3951<dd><p> 3952 Any exceptions thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>. 3953 </p></dd> 3954</dl> 3955</div> 3956</div> 3957<div class="section"> 3958<div class="titlepage"><div><div><h5 class="title"> 3959<a name="thread.synchronization.locks.unique_lock.constructor_duration"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_duration" title="template <class Rep, class Period> unique_lock(Lockable & m,const chrono::duration<Rep, Period>& abs_time)"><code class="computeroutput"><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> 3960 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 3961 <span class="identifier">m</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">abs_time</span><span class="special">)</span></code></a> 3962</h5></div></div></div> 3963<div class="variablelist"> 3964<p class="title"><b></b></p> 3965<dl class="variablelist"> 3966<dt><span class="term">Effects:</span></dt> 3967<dd><p> 3968 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 3969 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>, 3970 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>. 3971 </p></dd> 3972<dt><span class="term">Postcondition:</span></dt> 3973<dd><p> 3974 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 3975 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 3976 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a> returned 3977 <code class="computeroutput"><span class="keyword">true</span></code>, then <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3978 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise 3979 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 3980 returns <code class="computeroutput"><span class="keyword">false</span></code>. 3981 </p></dd> 3982<dt><span class="term">Throws:</span></dt> 3983<dd><p> 3984 Any exceptions thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>. 3985 </p></dd> 3986</dl> 3987</div> 3988</div> 3989<div class="section"> 3990<div class="titlepage"><div><div><h5 class="title"> 3991<a name="thread.synchronization.locks.unique_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.destructor" title="~unique_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">unique_lock</span><span class="special">()</span></code></a> 3992</h5></div></div></div> 3993<div class="variablelist"> 3994<p class="title"><b></b></p> 3995<dl class="variablelist"> 3996<dt><span class="term">Effects:</span></dt> 3997<dd><p> 3998 Invokes <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a><code class="computeroutput"><span class="special">-></span></code> <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 3999 if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4000 returns <code class="computeroutput"><span class="keyword">true</span></code>. 4001 </p></dd> 4002<dt><span class="term">Throws:</span></dt> 4003<dd><p> 4004 Nothing. 4005 </p></dd> 4006</dl> 4007</div> 4008</div> 4009<div class="section"> 4010<div class="titlepage"><div><div><h5 class="title"> 4011<a name="thread.synchronization.locks.unique_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a> 4012</h5></div></div></div> 4013<div class="variablelist"> 4014<p class="title"><b></b></p> 4015<dl class="variablelist"> 4016<dt><span class="term">Returns:</span></dt> 4017<dd><p> 4018 <code class="computeroutput"><span class="keyword">true</span></code> if the <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 4019 owns the lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated 4020 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 4021 </p></dd> 4022<dt><span class="term">Throws:</span></dt> 4023<dd><p> 4024 Nothing. 4025 </p></dd> 4026</dl> 4027</div> 4028</div> 4029<div class="section"> 4030<div class="titlepage"><div><div><h5 class="title"> 4031<a name="thread.synchronization.locks.unique_lock.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a> 4032</h5></div></div></div> 4033<div class="variablelist"> 4034<p class="title"><b></b></p> 4035<dl class="variablelist"> 4036<dt><span class="term">Returns:</span></dt> 4037<dd><p> 4038 A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated 4039 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 4040 or <code class="computeroutput"><span class="identifier">NULL</span></code> if there 4041 is no such object. 4042 </p></dd> 4043<dt><span class="term">Throws:</span></dt> 4044<dd><p> 4045 Nothing. 4046 </p></dd> 4047</dl> 4048</div> 4049</div> 4050<div class="section"> 4051<div class="titlepage"><div><div><h5 class="title"> 4052<a name="thread.synchronization.locks.unique_lock.explicit_bool_conversion"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.explicit_bool_conversion" title="explicit operator bool() const"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span> 4053 <span class="keyword">bool</span><span class="special">()</span> 4054 <span class="keyword">const</span></code></a> 4055</h5></div></div></div> 4056<div class="variablelist"> 4057<p class="title"><b></b></p> 4058<dl class="variablelist"> 4059<dt><span class="term">Returns:</span></dt> 4060<dd><p> 4061 <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code>. 4062 </p></dd> 4063<dt><span class="term">Throws:</span></dt> 4064<dd><p> 4065 Nothing. 4066 </p></dd> 4067</dl> 4068</div> 4069</div> 4070<div class="section"> 4071<div class="titlepage"><div><div><h5 class="title"> 4072<a name="thread.synchronization.locks.unique_lock.release"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.release" title="Lockable* release()"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a> 4073</h5></div></div></div> 4074<div class="variablelist"> 4075<p class="title"><b></b></p> 4076<dl class="variablelist"> 4077<dt><span class="term">Effects:</span></dt> 4078<dd><p> 4079 The association between <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is removed, 4080 without affecting the lock state of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. If <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4081 would have returned <code class="computeroutput"><span class="keyword">true</span></code>, 4082 it is the responsibility of the calling code to ensure that the 4083 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is correctly 4084 unlocked. 4085 </p></dd> 4086<dt><span class="term">Returns:</span></dt> 4087<dd><p> 4088 A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated 4089 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 4090 at the point of the call, or <code class="computeroutput"><span class="identifier">NULL</span></code> 4091 if there is no such object. 4092 </p></dd> 4093<dt><span class="term">Throws:</span></dt> 4094<dd><p> 4095 Nothing. 4096 </p></dd> 4097<dt><span class="term">Postcondition:</span></dt> 4098<dd><p> 4099 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 4100 is no longer associated with any <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4101 returns <code class="computeroutput"><span class="identifier">NULL</span></code> and 4102 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4103 returns <code class="computeroutput"><span class="keyword">false</span></code>. 4104 </p></dd> 4105</dl> 4106</div> 4107</div> 4108</div> 4109<div class="section"> 4110<div class="titlepage"><div><div><h4 class="title"> 4111<a name="thread.synchronization.locks.shared_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14">Class template 4112 <code class="computeroutput"><span class="identifier">shared_lock</span></code> - C++14</a> 4113</h4></div></div></div> 4114<div class="toc"><dl class="toc"> 4115<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.defaultconstructor"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">()</span></code></a></span></dt> 4116<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4117 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt> 4118<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_adopt"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4119 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt> 4120<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_defer"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4121 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a></span></dt> 4122<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_try"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4123 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt> 4124<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_abs_time"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4125 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</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></code></a></span></dt> 4126<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock</span><span class="special">()</span></code></a></span></dt> 4127<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt> 4128<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.mutex"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt> 4129<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.explicit_operator_bool"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span> 4130 <span class="keyword">bool</span><span class="special">()</span> 4131 <span class="keyword">const</span></code></a></span></dt> 4132<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.release"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a></span></dt> 4133</dl></div> 4134<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span> 4135<span class="comment">// #include <boost/thread/lock_types.hpp> </span> 4136 4137<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 4138<span class="keyword">class</span> <span class="identifier">shared_lock</span> 4139<span class="special">{</span> 4140<span class="keyword">public</span><span class="special">:</span> 4141 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span> 4142 4143 <span class="comment">// Shared locking</span> 4144 <span class="identifier">shared_lock</span><span class="special">();</span> 4145 <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span> 4146 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span> 4147 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_lock_t</span><span class="special">);</span> 4148 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span> 4149 <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> 4150 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&</span> <span class="identifier">mtx</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> 4151 <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> 4152 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&</span> <span class="identifier">mtx</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">d</span><span class="special">);</span> 4153 <span class="special">~</span><span class="identifier">shared_lock</span><span class="special">();</span> 4154 4155 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">shared_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4156 <span class="identifier">shared_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4157 4158 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4159 <span class="identifier">shared_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4160 4161 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 4162 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 4163 <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> 4164 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 4165 <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> 4166 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 4167 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 4168 4169 <span class="comment">// Conversion from upgrade locking</span> 4170 <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 4171 4172 <span class="comment">// Conversion from exclusive locking</span> 4173 <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4174 4175 <span class="comment">// Setters</span> 4176 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span> 4177 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 4178 4179 <span class="comment">// Getters</span> 4180 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4181 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4182 <span class="identifier">mutex_type</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4183 4184<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USE_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span> 4185 <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">target_time</span><span class="special">);</span> 4186 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">target_time</span><span class="special">);</span> 4187<span class="preprocessor">#endif</span> 4188<span class="special">};</span> 4189</pre> 4190<p> 4191 Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> models the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>, but rather than 4192 acquiring unique ownership of the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, locking an instance 4193 of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> acquires shared ownership. 4194 </p> 4195<p> 4196 Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, not only does it 4197 provide for RAII-style locking, it also allows for deferring acquiring 4198 the lock until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 4199 member function is called explicitly, or trying to acquire the lock in 4200 a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 4201 is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise 4202 adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. 4203 </p> 4204<p> 4205 An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span> 4206 the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code> 4207 if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4208 returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code> 4209 and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4210 returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object 4211 that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed, 4212 then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>. 4213 </p> 4214<p> 4215 The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> are not thread-safe. 4216 In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> is intended to model 4217 the shared ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object by a particular 4218 thread, and the member functions that release ownership of the lock state 4219 (including the destructor) must be called by the same thread that acquired 4220 ownership of the lock state. 4221 </p> 4222<div class="section"> 4223<div class="titlepage"><div><div><h5 class="title"> 4224<a name="thread.synchronization.locks.shared_lock.defaultconstructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.defaultconstructor" title="shared_lock()"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">()</span></code></a> 4225</h5></div></div></div> 4226<div class="variablelist"> 4227<p class="title"><b></b></p> 4228<dl class="variablelist"> 4229<dt><span class="term">Effects:</span></dt> 4230<dd><p> 4231 Creates a lock object with no associated mutex. 4232 </p></dd> 4233<dt><span class="term">Postcondition:</span></dt> 4234<dd><p> 4235 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4236 returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4237 returns <code class="computeroutput"><span class="identifier">NULL</span></code>. 4238 </p></dd> 4239<dt><span class="term">Throws:</span></dt> 4240<dd><p> 4241 Nothing. 4242 </p></dd> 4243</dl> 4244</div> 4245</div> 4246<div class="section"> 4247<div class="titlepage"><div><div><h5 class="title"> 4248<a name="thread.synchronization.locks.shared_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor" title="shared_lock(Lockable & m)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4249 <span class="identifier">m</span><span class="special">)</span></code></a> 4250</h5></div></div></div> 4251<div class="variablelist"> 4252<p class="title"><b></b></p> 4253<dl class="variablelist"> 4254<dt><span class="term">Effects:</span></dt> 4255<dd><p> 4256 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 4257 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a>. 4258 </p></dd> 4259<dt><span class="term">Postcondition:</span></dt> 4260<dd><p> 4261 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4262 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4263 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 4264 </p></dd> 4265<dt><span class="term">Throws:</span></dt> 4266<dd><p> 4267 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a>. 4268 </p></dd> 4269</dl> 4270</div> 4271</div> 4272<div class="section"> 4273<div class="titlepage"><div><div><h5 class="title"> 4274<a name="thread.synchronization.locks.shared_lock.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_adopt" title="shared_lock(Lockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4275 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a> 4276</h5></div></div></div> 4277<div class="variablelist"> 4278<p class="title"><b></b></p> 4279<dl class="variablelist"> 4280<dt><span class="term">Precondition:</span></dt> 4281<dd><p> 4282 The current thread owns an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>. 4283 </p></dd> 4284<dt><span class="term">Effects:</span></dt> 4285<dd><p> 4286 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 4287 Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>. 4288 </p></dd> 4289<dt><span class="term">Postcondition:</span></dt> 4290<dd><p> 4291 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4292 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4293 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 4294 </p></dd> 4295<dt><span class="term">Throws:</span></dt> 4296<dd><p> 4297 Nothing. 4298 </p></dd> 4299</dl> 4300</div> 4301</div> 4302<div class="section"> 4303<div class="titlepage"><div><div><h5 class="title"> 4304<a name="thread.synchronization.locks.shared_lock.constructor_defer"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_defer" title="shared_lock(Lockable & m,boost::defer_lock_t)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4305 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a> 4306</h5></div></div></div> 4307<div class="variablelist"> 4308<p class="title"><b></b></p> 4309<dl class="variablelist"> 4310<dt><span class="term">Effects:</span></dt> 4311<dd><p> 4312 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 4313 </p></dd> 4314<dt><span class="term">Postcondition:</span></dt> 4315<dd><p> 4316 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4317 returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4318 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 4319 </p></dd> 4320<dt><span class="term">Throws:</span></dt> 4321<dd><p> 4322 Nothing. 4323 </p></dd> 4324</dl> 4325</div> 4326</div> 4327<div class="section"> 4328<div class="titlepage"><div><div><h5 class="title"> 4329<a name="thread.synchronization.locks.shared_lock.constructor_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_try" title="shared_lock(Lockable & m,boost::try_to_lock_t)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4330 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a> 4331</h5></div></div></div> 4332<div class="variablelist"> 4333<p class="title"><b></b></p> 4334<dl class="variablelist"> 4335<dt><span class="term">Effects:</span></dt> 4336<dd><p> 4337 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 4338 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>, 4339 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>. 4340 </p></dd> 4341<dt><span class="term">Postcondition:</span></dt> 4342<dd><p> 4343 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4344 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 4345 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a> 4346 returned <code class="computeroutput"><span class="keyword">true</span></code>, then 4347 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4348 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise 4349 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4350 returns <code class="computeroutput"><span class="keyword">false</span></code>. 4351 </p></dd> 4352<dt><span class="term">Throws:</span></dt> 4353<dd><p> 4354 Nothing. 4355 </p></dd> 4356</dl> 4357</div> 4358</div> 4359<div class="section"> 4360<div class="titlepage"><div><div><h5 class="title"> 4361<a name="thread.synchronization.locks.shared_lock.constructor_abs_time"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_abs_time" title="shared_lock(Lockable & m,boost::system_time const& abs_time)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4362 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</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></code></a> 4363</h5></div></div></div> 4364<div class="variablelist"> 4365<p class="title"><b></b></p> 4366<dl class="variablelist"> 4367<dt><span class="term">Effects:</span></dt> 4368<dd><p> 4369 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 4370 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>, 4371 and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>. 4372 </p></dd> 4373<dt><span class="term">Postcondition:</span></dt> 4374<dd><p> 4375 <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4376 returns <code class="computeroutput"><span class="special">&</span><span class="identifier">m</span></code>. 4377 If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a> 4378 returned <code class="computeroutput"><span class="keyword">true</span></code>, then 4379 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4380 returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise 4381 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4382 returns <code class="computeroutput"><span class="keyword">false</span></code>. 4383 </p></dd> 4384<dt><span class="term">Throws:</span></dt> 4385<dd><p> 4386 Any exceptions thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>. 4387 </p></dd> 4388</dl> 4389</div> 4390</div> 4391<div class="section"> 4392<div class="titlepage"><div><div><h5 class="title"> 4393<a name="thread.synchronization.locks.shared_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.destructor" title="~shared_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock</span><span class="special">()</span></code></a> 4394</h5></div></div></div> 4395<div class="variablelist"> 4396<p class="title"><b></b></p> 4397<dl class="variablelist"> 4398<dt><span class="term">Effects:</span></dt> 4399<dd><p> 4400 Invokes <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a><code class="computeroutput"><span class="special">-></span></code> <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a> 4401 if <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4402 returns <code class="computeroutput"><span class="keyword">true</span></code>. 4403 </p></dd> 4404<dt><span class="term">Throws:</span></dt> 4405<dd><p> 4406 Nothing. 4407 </p></dd> 4408</dl> 4409</div> 4410</div> 4411<div class="section"> 4412<div class="titlepage"><div><div><h5 class="title"> 4413<a name="thread.synchronization.locks.shared_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a> 4414</h5></div></div></div> 4415<div class="variablelist"> 4416<p class="title"><b></b></p> 4417<dl class="variablelist"> 4418<dt><span class="term">Returns:</span></dt> 4419<dd><p> 4420 <code class="computeroutput"><span class="keyword">true</span></code> if the <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 4421 owns the lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated 4422 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 4423 </p></dd> 4424<dt><span class="term">Throws:</span></dt> 4425<dd><p> 4426 Nothing. 4427 </p></dd> 4428</dl> 4429</div> 4430</div> 4431<div class="section"> 4432<div class="titlepage"><div><div><h5 class="title"> 4433<a name="thread.synchronization.locks.shared_lock.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.mutex" title="Lockable* mutex() const"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span></code></a> 4434</h5></div></div></div> 4435<div class="variablelist"> 4436<p class="title"><b></b></p> 4437<dl class="variablelist"> 4438<dt><span class="term">Returns:</span></dt> 4439<dd><p> 4440 A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated 4441 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 4442 or <code class="computeroutput"><span class="identifier">NULL</span></code> if there 4443 is no such object. 4444 </p></dd> 4445<dt><span class="term">Throws:</span></dt> 4446<dd><p> 4447 Nothing. 4448 </p></dd> 4449</dl> 4450</div> 4451</div> 4452<div class="section"> 4453<div class="titlepage"><div><div><h5 class="title"> 4454<a name="thread.synchronization.locks.shared_lock.explicit_operator_bool"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.explicit_operator_bool" title="explicit operator bool() const"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span> 4455 <span class="keyword">bool</span><span class="special">()</span> 4456 <span class="keyword">const</span></code></a> 4457</h5></div></div></div> 4458<div class="variablelist"> 4459<p class="title"><b></b></p> 4460<dl class="variablelist"> 4461<dt><span class="term">Returns:</span></dt> 4462<dd><p> 4463 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>. 4464 </p></dd> 4465<dt><span class="term">Throws:</span></dt> 4466<dd><p> 4467 Nothing. 4468 </p></dd> 4469</dl> 4470</div> 4471</div> 4472<div class="section"> 4473<div class="titlepage"><div><div><h5 class="title"> 4474<a name="thread.synchronization.locks.shared_lock.release"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.release" title="Lockable* release()"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a> 4475</h5></div></div></div> 4476<div class="variablelist"> 4477<p class="title"><b></b></p> 4478<dl class="variablelist"> 4479<dt><span class="term">Effects:</span></dt> 4480<dd><p> 4481 The association between <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is removed, 4482 without affecting the lock state of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. If <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4483 would have returned <code class="computeroutput"><span class="keyword">true</span></code>, 4484 it is the responsibility of the calling code to ensure that the 4485 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is correctly 4486 unlocked. 4487 </p></dd> 4488<dt><span class="term">Returns:</span></dt> 4489<dd><p> 4490 A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated 4491 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 4492 at the point of the call, or <code class="computeroutput"><span class="identifier">NULL</span></code> 4493 if there is no such object. 4494 </p></dd> 4495<dt><span class="term">Throws:</span></dt> 4496<dd><p> 4497 Nothing. 4498 </p></dd> 4499<dt><span class="term">Postcondition:</span></dt> 4500<dd><p> 4501 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 4502 is no longer associated with any <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4503 returns <code class="computeroutput"><span class="identifier">NULL</span></code> and 4504 <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4505 returns <code class="computeroutput"><span class="keyword">false</span></code>. 4506 </p></dd> 4507</dl> 4508</div> 4509</div> 4510</div> 4511<div class="section"> 4512<div class="titlepage"><div><div><h4 class="title"> 4513<a name="thread.synchronization.locks.upgrade_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION">Class template 4514 <code class="computeroutput"><span class="identifier">upgrade_lock</span></code> - EXTENSION</a> 4515</h4></div></div></div> 4516<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span> 4517<span class="comment">// #include <boost/thread/lock_types.hpp> </span> 4518 4519<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 4520<span class="keyword">class</span> <span class="identifier">upgrade_lock</span> 4521<span class="special">{</span> 4522<span class="keyword">public</span><span class="special">:</span> 4523 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span> 4524 4525 <span class="comment">// Upgrade locking</span> 4526 4527 <span class="identifier">upgrade_lock</span><span class="special">();</span> 4528 <span class="keyword">explicit</span> <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span> 4529 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">defer_lock_t</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 4530 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span> 4531 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span> 4532 <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> 4533 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> 4534 <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> 4535 <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> 4536 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> 4537 <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> 4538 <span class="special">~</span><span class="identifier">upgrade_lock</span><span class="special">();</span> 4539 4540 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">upgrade_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4541 <span class="identifier">upgrade_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4542 4543 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4544 <span class="identifier">upgrade_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4545 4546 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 4547 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 4548 <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> 4549 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 4550 <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> 4551 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 4552 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 4553 4554<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span> 4555 <span class="comment">// Conversion from shared locking</span> 4556 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span> 4557 <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> 4558 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> 4559 <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> 4560 <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> 4561 <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&&</span> <span class="identifier">sl</span><span class="special">,</span> 4562 <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> 4563<span class="preprocessor">#endif</span> 4564 4565 <span class="comment">// Conversion from exclusive locking</span> 4566 <span class="keyword">explicit</span> <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4567 4568 <span class="comment">// Setters</span> 4569 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span> 4570 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 4571 4572 <span class="comment">// Getters</span> 4573 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4574 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4575 <span class="identifier">mutex_type</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4576<span class="special">};</span> 4577</pre> 4578<p> 4579 Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> models the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>, but rather than 4580 acquiring unique ownership of the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, locking an instance 4581 of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> acquires upgrade 4582 ownership. 4583 </p> 4584<p> 4585 Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, not only does it 4586 provide for RAII-style locking, it also allows for deferring acquiring 4587 the lock until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 4588 member function is called explicitly, or trying to acquire the lock in 4589 a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 4590 is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise 4591 adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. 4592 </p> 4593<p> 4594 An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span> 4595 the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code> 4596 if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a> 4597 returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code> 4598 and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a> 4599 returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object 4600 that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed, 4601 then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-></span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>. 4602 </p> 4603<p> 4604 The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> are not thread-safe. 4605 In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> is intended to model 4606 the upgrade ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> object by a particular 4607 thread, and the member functions that release ownership of the lock state 4608 (including the destructor) must be called by the same thread that acquired 4609 ownership of the lock state. 4610 </p> 4611</div> 4612<div class="section"> 4613<div class="titlepage"><div><div><h4 class="title"> 4614<a name="thread.synchronization.locks.upgrade_to_unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION">Class 4615 template <code class="computeroutput"><span class="identifier">upgrade_to_unique_lock</span></code> 4616 -- EXTENSION</a> 4617</h4></div></div></div> 4618<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span> 4619<span class="comment">// #include <boost/thread/lock_types.hpp> </span> 4620 4621<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">></span> 4622<span class="keyword">class</span> <span class="identifier">upgrade_to_unique_lock</span> 4623<span class="special">{</span> 4624<span class="keyword">public</span><span class="special">:</span> 4625 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span> 4626 <span class="keyword">explicit</span> <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&</span> <span class="identifier">m_</span><span class="special">);</span> 4627 <span class="special">~</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">();</span> 4628 4629 <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4630 <span class="identifier">upgrade_to_unique_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4631 4632 <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4633 <span class="identifier">upgrade_to_unique_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4634 4635 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span> 4636 4637 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4638 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4639 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4640 4641<span class="special">};</span> 4642</pre> 4643<p> 4644 <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_to_unique_lock</span></code></a> allows 4645 for a temporary upgrade of an <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> to exclusive ownership. 4646 When constructed with a reference to an instance of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a>, if that instance 4647 has upgrade ownership on some <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, that ownership 4648 is upgraded to exclusive ownership. When the <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_to_unique_lock</span></code></a> instance 4649 is destroyed, the ownership of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is downgraded back to 4650 <span class="emphasis"><em>upgrade ownership</em></span>. 4651 </p> 4652</div> 4653<div class="section"> 4654<div class="titlepage"><div><div><h4 class="title"> 4655<a name="thread.synchronization.locks.scoped_try_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.scoped_try_lock" title="Mutex-specific class scoped_try_lock -- DEPRECATED">Mutex-specific 4656 class <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> -- 4657 DEPRECATED</a> 4658</h4></div></div></div> 4659<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span> 4660<span class="special">{</span> 4661<span class="keyword">private</span><span class="special">:</span> 4662 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">>&</span> <span class="identifier">other</span><span class="special">);</span> 4663 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">>&</span> <span class="identifier">other</span><span class="special">);</span> 4664<span class="keyword">public</span><span class="special">:</span> 4665 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">();</span> 4666 <span class="keyword">explicit</span> <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&</span> <span class="identifier">m</span><span class="special">);</span> 4667 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span> 4668 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_lock_t</span><span class="special">);</span> 4669 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span> 4670 4671 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">);</span> 4672 <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">>&&</span> <span class="identifier">other</span><span class="special">);</span> 4673 4674 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 4675 4676 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 4677 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 4678 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 4679 4680 <span class="identifier">MutexType</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4681 <span class="identifier">MutexType</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span> 4682 4683 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4684 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 4685<span class="special">};</span> 4686</pre> 4687<p> 4688 The member typedef <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> 4689 is provided for each distinct <code class="computeroutput"><span class="identifier">MutexType</span></code> 4690 as a typedef to a class with the preceding definition. The semantics of 4691 each constructor and member function are identical to those of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">></span></code></a> 4692 for the same <code class="computeroutput"><span class="identifier">MutexType</span></code>, 4693 except that the constructor that takes a single reference to a mutex will 4694 call <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a> rather than <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>. 4695 </p> 4696</div> 4697</div> 4698<div class="section"> 4699<div class="titlepage"><div><div><h3 class="title"> 4700<a name="thread.synchronization.other_locks"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks" title="Other Lock Types - EXTENSION">Other Lock Types 4701 - EXTENSION</a> 4702</h3></div></div></div> 4703<div class="toc"><dl class="toc"> 4704<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks">Strict 4705 Locks</a></span></dt> 4706<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs">Locking 4707 pointers</a></span></dt> 4708<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked">Externally 4709 Locked</a></span></dt> 4710<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard">Class 4711 template <code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a></span></dt> 4712<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock">Class 4713 template <code class="computeroutput"><span class="identifier">reverse_lock</span></code></a></span></dt> 4714</dl></div> 4715<div class="section"> 4716<div class="titlepage"><div><div><h4 class="title"> 4717<a name="thread.synchronization.other_locks.strict_locks"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks" title="Strict Locks">Strict 4718 Locks</a> 4719</h4></div></div></div> 4720<div class="toc"><dl class="toc"> 4721<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock">Class 4722 template <code class="computeroutput"><span class="identifier">strict_lock</span></code></a></span></dt> 4723<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock">Class 4724 template <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a></span></dt> 4725<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_strict_lock">Non 4726 Member Function <code class="computeroutput"><span class="identifier">make_strict_lock</span></code></a></span></dt> 4727<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_nested_strict_lock">Non 4728 Member Function <code class="computeroutput"><span class="identifier">make_nested_strict_lock</span></code></a></span></dt> 4729</dl></div> 4730<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp> </span> 4731<span class="comment">// #include <boost/thread/strict_lock.hpp> </span> 4732 4733<span class="keyword">namespace</span> <span class="identifier">boost</span> 4734<span class="special">{</span> 4735 4736 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 4737 <span class="keyword">class</span> <span class="identifier">strict_lock</span><span class="special">;</span> 4738 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span> 4739 <span class="keyword">class</span> <span class="identifier">nested_strict_lock</span><span class="special">;</span> 4740 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 4741 <span class="keyword">struct</span> <span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">>;</span> 4742 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span> 4743 <span class="keyword">struct</span> <span class="identifier">is_strict_lock_sur_parole</span><span class="special"><</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">></span> <span class="special">>;</span> 4744 4745<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_STRICT_LOCK</span> 4746 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 4747 <span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> 4748<span class="preprocessor">#endif</span> 4749<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_NESTED_STRICT_LOCK</span> 4750 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span> 4751 <span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">></span> <span class="identifier">make_nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span> 4752<span class="preprocessor">#endif</span> 4753 4754<span class="special">}</span> 4755</pre> 4756<div class="section"> 4757<div class="titlepage"><div><div><h5 class="title"> 4758<a name="thread.synchronization.other_locks.strict_locks.strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock">Class 4759 template <code class="computeroutput"><span class="identifier">strict_lock</span></code></a> 4760</h5></div></div></div> 4761<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span> 4762<span class="comment">// #include <boost/thread/strict_lock.hpp> </span> 4763 4764<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">BasicLockable</span><span class="special">></span> 4765<span class="keyword">class</span> <span class="identifier">strict_lock</span> 4766<span class="special">{</span> 4767<span class="keyword">public</span><span class="special">:</span> 4768 <span class="keyword">typedef</span> <span class="identifier">BasicLockable</span> <span class="identifier">mutex_type</span><span class="special">;</span> 4769 <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4770 <span class="identifier">strict_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4771 <span class="keyword">explicit</span> <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span> 4772 <span class="special">~</span><span class="identifier">strict_lock</span><span class="special">();</span> 4773 4774 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 4775<span class="special">};</span> 4776</pre> 4777<p> 4778 <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock"><code class="computeroutput"><span class="identifier">strict_lock</span></code></a> is a model of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>. 4779 </p> 4780<p> 4781 <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock"><code class="computeroutput"><span class="identifier">strict_lock</span></code></a> is the simplest 4782 <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>: on construction 4783 it acquires ownership of the implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept supplied 4784 as the constructor parameter. On destruction, the ownership is released. 4785 This provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> object, to facilitate 4786 exception-safe locking and unlocking. 4787 </p> 4788<h6> 4789<a name="thread.synchronization.other_locks.strict_locks.strict_lock.h0"></a> 4790 <span class="phrase"><a name="thread.synchronization.other_locks.strict_locks.strict_lock.see_also__link_linkend__thread_synchronization_lock_guard_lock_guard___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__lock_guard__phrase___code___link_"></a></span><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.see_also__link_linkend__thread_synchronization_lock_guard_lock_guard___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__lock_guard__phrase___code___link_">See 4791 also <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a> 4792 </h6> 4793<div class="section"> 4794<div class="titlepage"><div><div><h6 class="title"> 4795<a name="thread.synchronization.other_locks.strict_locks.strict_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.constructor" title="strict_lock(Lockable & m)"><code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&</span> 4796 <span class="identifier">m</span><span class="special">)</span></code></a> 4797</h6></div></div></div> 4798<div class="variablelist"> 4799<p class="title"><b></b></p> 4800<dl class="variablelist"> 4801<dt><span class="term">Effects:</span></dt> 4802<dd><p> 4803 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 4804 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 4805 </p></dd> 4806<dt><span class="term">Throws:</span></dt> 4807<dd><p> 4808 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 4809 </p></dd> 4810</dl> 4811</div> 4812</div> 4813<div class="section"> 4814<div class="titlepage"><div><div><h6 class="title"> 4815<a name="thread.synchronization.other_locks.strict_locks.strict_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.destructor" title="~strict_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">strict_lock</span><span class="special">()</span></code></a> 4816</h6></div></div></div> 4817<div class="variablelist"> 4818<p class="title"><b></b></p> 4819<dl class="variablelist"> 4820<dt><span class="term">Effects:</span></dt> 4821<dd><p> 4822 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a> 4823 on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed 4824 to the constructor. 4825 </p></dd> 4826<dt><span class="term">Throws:</span></dt> 4827<dd><p> 4828 Nothing. 4829 </p></dd> 4830</dl> 4831</div> 4832</div> 4833</div> 4834<div class="section"> 4835<div class="titlepage"><div><div><h5 class="title"> 4836<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock" title="Class template nested_strict_lock">Class 4837 template <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a> 4838</h5></div></div></div> 4839<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span> 4840<span class="comment">// #include <boost/thread/strict_lock.hpp> </span> 4841 4842<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span> 4843<span class="keyword">class</span> <span class="identifier">nested_strict_lock</span> 4844<span class="special">{</span> 4845<span class="keyword">public</span><span class="special">:</span> 4846 <span class="keyword">typedef</span> <span class="identifier">BasicLockable</span> <span class="identifier">mutex_type</span><span class="special">;</span> 4847 <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">nested_strict_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4848 <span class="identifier">nested_strict_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">nested_strict_lock</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 4849 <span class="keyword">explicit</span> <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">),</span> 4850 <span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 4851 4852 <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 4853<span class="special">};</span> 4854</pre> 4855<p> 4856 <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock" title="Class template nested_strict_lock"><code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a> is a model 4857 of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>. 4858 </p> 4859<p> 4860 A nested strict lock is a scoped lock guard ensuring a mutex is locked 4861 on its scope, by taking ownership of a nesting lock, locking the mutex 4862 on construction if not already locked and restoring the ownership to 4863 the nesting lock on destruction. 4864 </p> 4865<h6> 4866<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.h0"></a> 4867 <span class="phrase"><a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.see_also__link_linkend__thread_synchronization_other_locks_strict_locks_strict_lock___code__phrase_role__identifier__strict_lock__phrase___code___link_____link_linkend__thread_synchronization_locks_unique_lock___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__unique_lock__phrase___code___link_"></a></span><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.see_also__link_linkend__thread_synchronization_other_locks_strict_locks_strict_lock___code__phrase_role__identifier__strict_lock__phrase___code___link_____link_linkend__thread_synchronization_locks_unique_lock___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__unique_lock__phrase___code___link_">See 4868 also <code class="computeroutput"><span class="identifier">strict_lock</span></code>, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> 4869 </h6> 4870<div class="section"> 4871<div class="titlepage"><div><div><h6 class="title"> 4872<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.constructor" title="nested_strict_lock(Lock & lk)"><code class="computeroutput"><span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&</span> 4873 <span class="identifier">lk</span><span class="special">)</span></code></a> 4874</h6></div></div></div> 4875<div class="variablelist"> 4876<p class="title"><b></b></p> 4877<dl class="variablelist"> 4878<dt><span class="term">Requires:</span></dt> 4879<dd><p> 4880 <code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()</span> 4881 <span class="special">!=</span> <span class="identifier">null_ptr</span></code>. 4882 </p></dd> 4883<dt><span class="term">Effects:</span></dt> 4884<dd><p> 4885 Stores the reference to the lock parameter <code class="computeroutput"><span class="identifier">lk</span></code> 4886 and takes ownership on it. If the lock doesn't owns the mutex 4887 lock it. 4888 </p></dd> 4889<dt><span class="term">Postcondition:</span></dt> 4890<dd><p> 4891 <code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">())</span></code>. 4892 </p></dd> 4893<dt><span class="term">Throws:</span></dt> 4894<dd> 4895<p> 4896 - lock_error when BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED 4897 is defined and lk.mutex() == null_ptr 4898 </p> 4899<p> 4900 - Any exception that @c lk.lock() can throw. 4901 </p> 4902</dd> 4903</dl> 4904</div> 4905</div> 4906<div class="section"> 4907<div class="titlepage"><div><div><h6 class="title"> 4908<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.destructor" title="~nested_strict_lock() noexcept"><code class="computeroutput"><span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="keyword">noexcept</span></code></a> 4909</h6></div></div></div> 4910<div class="variablelist"> 4911<p class="title"><b></b></p> 4912<dl class="variablelist"> 4913<dt><span class="term">Effects:</span></dt> 4914<dd><p> 4915 Restores ownership to the nesting lock. 4916 </p></dd> 4917</dl> 4918</div> 4919</div> 4920<div class="section"> 4921<div class="titlepage"><div><div><h6 class="title"> 4922<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.owns_lock" title="bool owns_lock(mutex_type const* l) const noexcept"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> 4923 <span class="keyword">const</span><span class="special">*</span> 4924 <span class="identifier">l</span><span class="special">)</span> 4925 <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a> 4926</h6></div></div></div> 4927<div class="variablelist"> 4928<p class="title"><b></b></p> 4929<dl class="variablelist"> 4930<dt><span class="term">Return:</span></dt> 4931<dd><p> 4932 Whether if this lock is locking that mutex. 4933 </p></dd> 4934</dl> 4935</div> 4936</div> 4937</div> 4938<div class="section"> 4939<div class="titlepage"><div><div><h5 class="title"> 4940<a name="thread.synchronization.other_locks.strict_locks.make_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_strict_lock" title="Non Member Function make_strict_lock">Non 4941 Member Function <code class="computeroutput"><span class="identifier">make_strict_lock</span></code></a> 4942</h5></div></div></div> 4943<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 4944<span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">m</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 4945</pre> 4946<div class="variablelist"> 4947<p class="title"><b></b></p> 4948<dl class="variablelist"> 4949<dt><span class="term">Returns:</span></dt> 4950<dd><p> 4951 a strict_lock as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">}</span></code>. 4952 </p></dd> 4953<dt><span class="term">Throws:</span></dt> 4954<dd><p> 4955 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 4956 </p></dd> 4957</dl> 4958</div> 4959</div> 4960<div class="section"> 4961<div class="titlepage"><div><div><h5 class="title"> 4962<a name="thread.synchronization.other_locks.strict_locks.make_nested_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_nested_strict_lock" title="Non Member Function make_nested_strict_lock">Non 4963 Member Function <code class="computeroutput"><span class="identifier">make_nested_strict_lock</span></code></a> 4964</h5></div></div></div> 4965<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span> 4966<span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">></span> <span class="identifier">make_nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 4967</pre> 4968<div class="variablelist"> 4969<p class="title"><b></b></p> 4970<dl class="variablelist"> 4971<dt><span class="term">Returns:</span></dt> 4972<dd><p> 4973 a nested_strict_lock as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">lk</span><span class="special">}</span></code>. 4974 </p></dd> 4975<dt><span class="term">Throws:</span></dt> 4976<dd><p> 4977 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 4978 </p></dd> 4979</dl> 4980</div> 4981</div> 4982</div> 4983<div class="section"> 4984<div class="titlepage"><div><div><h4 class="title"> 4985<a name="thread.synchronization.other_locks.lock_ptrs"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs" title="Locking pointers">Locking 4986 pointers</a> 4987</h4></div></div></div> 4988<div class="toc"><dl class="toc"> 4989<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr">Class 4990 template <code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span> 4991 </code></a></span></dt> 4992<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr">Class 4993 template <code class="computeroutput"><span class="identifier">strict_lock_ptr</span></code></a></span></dt> 4994</dl></div> 4995<pre class="programlisting"><span class="comment">// #include <boost/thread/synchroniezd_value.hpp> </span> 4996<span class="comment">// #include <boost/thread/strict_lock_ptr.hpp> </span> 4997 4998<span class="keyword">namespace</span> <span class="identifier">boost</span> 4999<span class="special">{</span> 5000 5001 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span> 5002 <span class="keyword">class</span> <span class="identifier">strict_lock_ptr</span><span class="special">;</span> 5003 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span> 5004 <span class="keyword">class</span> <span class="identifier">const_strict_lock_ptr</span><span class="special">;</span> 5005<span class="special">}</span> 5006</pre> 5007<div class="section"> 5008<div class="titlepage"><div><div><h5 class="title"> 5009<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr" title="Class template const_strict_lock_ptr">Class 5010 template <code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span> 5011 </code></a> 5012</h5></div></div></div> 5013<pre class="programlisting"><span class="comment">// #include <boost/thread/synchroniezd_value.hpp> </span> 5014<span class="comment">// #include <boost/thread/strict_lock_ptr.hpp> </span> 5015 5016 5017<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span> 5018<span class="keyword">class</span> <span class="identifier">const_strict_lock_ptr</span> 5019<span class="special">{</span> 5020<span class="keyword">public</span><span class="special">:</span> 5021 <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span> 5022 <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span> 5023 5024 <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">const_strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 5025 <span class="identifier">const_strict_lock_ptr</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">const_strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 5026 5027 <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> 5028 <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> 5029 5030 <span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">();</span> 5031 5032 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span> 5033 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span> 5034 5035<span class="special">};</span> 5036</pre> 5037<div class="section"> 5038<div class="titlepage"><div><div><h6 class="title"> 5039<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor" title="const_strict_lock_ptr(T const&,Lockable&)"><code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span><span class="identifier">Lockable</span><span class="special">&)</span></code></a> 5040</h6></div></div></div> 5041<pre class="programlisting"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">m</span><span class="special">);</span> 5042</pre> 5043<div class="variablelist"> 5044<p class="title"><b></b></p> 5045<dl class="variablelist"> 5046<dt><span class="term">Effects:</span></dt> 5047<dd><p> 5048 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>, 5049 stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>. 5050 </p></dd> 5051<dt><span class="term">Throws:</span></dt> 5052<dd><p> 5053 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 5054 </p></dd> 5055</dl> 5056</div> 5057</div> 5058<div class="section"> 5059<div class="titlepage"><div><div><h6 class="title"> 5060<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor_adopt" title="const_strict_lock_ptr(T const&,Lockable&,adopt_lock_t)"><code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span><span class="identifier">Lockable</span><span class="special">&,</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a> 5061</h6></div></div></div> 5062<pre class="programlisting"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> 5063</pre> 5064<div class="variablelist"> 5065<p class="title"><b></b></p> 5066<dl class="variablelist"> 5067<dt><span class="term">Effects:</span></dt> 5068<dd><p> 5069 Stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>. 5070 </p></dd> 5071<dt><span class="term">Throws:</span></dt> 5072<dd><p> 5073 Nothing. 5074 </p></dd> 5075</dl> 5076</div> 5077</div> 5078<div class="section"> 5079<div class="titlepage"><div><div><h6 class="title"> 5080<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.destructor" title="~const_strict_lock_ptr()"><code class="computeroutput"><span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">()</span></code></a> 5081</h6></div></div></div> 5082<pre class="programlisting"><span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">();</span> 5083</pre> 5084<div class="variablelist"> 5085<p class="title"><b></b></p> 5086<dl class="variablelist"> 5087<dt><span class="term">Effects:</span></dt> 5088<dd><p> 5089 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a> 5090 on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed 5091 to the constructor. 5092 </p></dd> 5093<dt><span class="term">Throws:</span></dt> 5094<dd><p> 5095 Nothing. 5096 </p></dd> 5097</dl> 5098</div> 5099</div> 5100<div class="section"> 5101<div class="titlepage"><div><div><h6 class="title"> 5102<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.indir"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.indir" title="operator->() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span> 5103 <span class="keyword">const</span></code></a> 5104</h6></div></div></div> 5105<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->()</span> <span class="keyword">const</span><span class="special">;</span> 5106</pre> 5107<div class="variablelist"> 5108<p class="title"><b></b></p> 5109<dl class="variablelist"> 5110<dt><span class="term">Return:</span></dt> 5111<dd><p> 5112 return a constant pointer to the protected value. 5113 </p></dd> 5114<dt><span class="term">Throws:</span></dt> 5115<dd><p> 5116 Nothing. 5117 </p></dd> 5118</dl> 5119</div> 5120</div> 5121<div class="section"> 5122<div class="titlepage"><div><div><h6 class="title"> 5123<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.deref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.deref" title="operator*() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span> 5124 <span class="keyword">const</span></code></a> 5125</h6></div></div></div> 5126<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span> 5127</pre> 5128<div class="variablelist"> 5129<p class="title"><b></b></p> 5130<dl class="variablelist"> 5131<dt><span class="term">Return:</span></dt> 5132<dd><p> 5133 return a constant reference to the protected value. 5134 </p></dd> 5135<dt><span class="term">Throws:</span></dt> 5136<dd><p> 5137 Nothing. 5138 </p></dd> 5139</dl> 5140</div> 5141</div> 5142</div> 5143<div class="section"> 5144<div class="titlepage"><div><div><h5 class="title"> 5145<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr" title="Class template strict_lock_ptr">Class 5146 template <code class="computeroutput"><span class="identifier">strict_lock_ptr</span></code></a> 5147</h5></div></div></div> 5148<pre class="programlisting"><span class="comment">// #include <boost/thread/synchroniezd_value.hpp> </span> 5149<span class="comment">// #include <boost/thread/strict_lock_ptr.hpp> </span> 5150 5151<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Lockable</span> <span class="special">=</span> <span class="identifier">mutex</span><span class="special">></span> 5152<span class="keyword">class</span> <span class="identifier">strict_lock_ptr</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">const_strict_lock_ptr</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">></span> 5153<span class="special">{</span> 5154<span class="keyword">public</span><span class="special">:</span> 5155 <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 5156 <span class="identifier">strict_lock_ptr</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 5157 5158 <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> 5159 <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> 5160 <span class="special">~</span><span class="identifier">strict_lock_ptr</span><span class="special">();</span> 5161 5162 <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->();</span> 5163 <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*();</span> 5164 5165<span class="special">};</span> 5166</pre> 5167<div class="section"> 5168<div class="titlepage"><div><div><h6 class="title"> 5169<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor" title="strict_lock_ptr(T const&,Lockable&)"><code class="computeroutput"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span><span class="identifier">Lockable</span><span class="special">&)</span></code></a> 5170</h6></div></div></div> 5171<pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">m</span><span class="special">);</span> 5172</pre> 5173<div class="variablelist"> 5174<p class="title"><b></b></p> 5175<dl class="variablelist"> 5176<dt><span class="term">Effects:</span></dt> 5177<dd><p> 5178 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>, 5179 stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>. 5180 </p></dd> 5181<dt><span class="term">Throws:</span></dt> 5182<dd><p> 5183 Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>. 5184 </p></dd> 5185</dl> 5186</div> 5187</div> 5188<div class="section"> 5189<div class="titlepage"><div><div><h6 class="title"> 5190<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor_adopt" title="strict_lock_ptr(T const&,Lockable&,adopt_lock_t)"><code class="computeroutput"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span><span class="identifier">Lockable</span><span class="special">&,</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a> 5191</h6></div></div></div> 5192<pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> 5193</pre> 5194<div class="variablelist"> 5195<p class="title"><b></b></p> 5196<dl class="variablelist"> 5197<dt><span class="term">Effects:</span></dt> 5198<dd><p> 5199 Stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>. 5200 </p></dd> 5201<dt><span class="term">Throws:</span></dt> 5202<dd><p> 5203 Nothing. 5204 </p></dd> 5205</dl> 5206</div> 5207</div> 5208<div class="section"> 5209<div class="titlepage"><div><div><h6 class="title"> 5210<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.destructor" title="~strict_lock_ptr()"><code class="computeroutput"><span class="special">~</span><span class="identifier">strict_lock_ptr</span><span class="special">()</span></code></a> 5211</h6></div></div></div> 5212<pre class="programlisting"><span class="special">~</span> <span class="identifier">strict_lock_ptr</span><span class="special">();</span> 5213</pre> 5214<div class="variablelist"> 5215<p class="title"><b></b></p> 5216<dl class="variablelist"> 5217<dt><span class="term">Effects:</span></dt> 5218<dd><p> 5219 Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a> 5220 on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed 5221 to the constructor. 5222 </p></dd> 5223<dt><span class="term">Throws:</span></dt> 5224<dd><p> 5225 Nothing. 5226 </p></dd> 5227</dl> 5228</div> 5229</div> 5230<div class="section"> 5231<div class="titlepage"><div><div><h6 class="title"> 5232<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.indir"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.indir" title="operator->()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">->()</span></code></a> 5233</h6></div></div></div> 5234<pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">->();</span> 5235</pre> 5236<div class="variablelist"> 5237<p class="title"><b></b></p> 5238<dl class="variablelist"> 5239<dt><span class="term">Return:</span></dt> 5240<dd><p> 5241 return a pointer to the protected value. 5242 </p></dd> 5243<dt><span class="term">Throws:</span></dt> 5244<dd><p> 5245 Nothing. 5246 </p></dd> 5247</dl> 5248</div> 5249</div> 5250<div class="section"> 5251<div class="titlepage"><div><div><h6 class="title"> 5252<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.deref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.deref" title="operator*()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code></a> 5253</h6></div></div></div> 5254<pre class="programlisting"><span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">*();</span> 5255</pre> 5256<div class="variablelist"> 5257<p class="title"><b></b></p> 5258<dl class="variablelist"> 5259<dt><span class="term">Return:</span></dt> 5260<dd><p> 5261 return a reference to the protected value. 5262 </p></dd> 5263<dt><span class="term">Throws:</span></dt> 5264<dd><p> 5265 Nothing. 5266 </p></dd> 5267</dl> 5268</div> 5269</div> 5270</div> 5271</div> 5272<div class="section"> 5273<div class="titlepage"><div><div><h4 class="title"> 5274<a name="thread.synchronization.other_locks.externally_locked"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked" title="Externally Locked">Externally 5275 Locked</a> 5276</h4></div></div></div> 5277<div class="toc"><dl class="toc"> 5278<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked">Template 5279 Class <code class="computeroutput"><span class="identifier">externally_locked</span></code></a></span></dt> 5280<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref">Template 5281 Class <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&></span></code></a></span></dt> 5282<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.swap"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&,</span> 5283 <span class="identifier">externally_locked</span><span class="special">&)</span></code></a></span></dt> 5284</dl></div> 5285<pre class="programlisting"><span class="comment">// #include <boost/thread/externally_locked.hpp></span> 5286<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> 5287<span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special">;</span> 5288<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span> 5289<span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&,</span> <span class="identifier">MutexType</span><span class="special">>;</span> 5290 5291<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span> 5292<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">></span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">></span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 5293</pre> 5294<div class="section"> 5295<div class="titlepage"><div><div><h5 class="title"> 5296<a name="thread.synchronization.other_locks.externally_locked.externally_locked"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked" title="Template Class externally_locked">Template 5297 Class <code class="computeroutput"><span class="identifier">externally_locked</span></code></a> 5298</h5></div></div></div> 5299<pre class="programlisting"><span class="comment">// #include <boost/thread/externally_locked.hpp></span> 5300 5301<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span> 5302<span class="keyword">class</span> <span class="identifier">externally_locked</span> 5303<span class="special">{</span> 5304 <span class="comment">//BOOST_CONCEPT_ASSERT(( CopyConstructible<T> ));</span> 5305 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span> <span class="identifier">BasicLockable</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">></span> <span class="special">));</span> 5306 5307<span class="keyword">public</span><span class="special">:</span> 5308 <span class="keyword">typedef</span> <span class="identifier">MutexType</span> <span class="identifier">mutex_type</span><span class="special">;</span> 5309 5310 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">);</span> 5311 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">obj</span><span class="special">);</span> 5312 <span class="keyword">explicit</span> <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> 5313 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 5314 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span> 5315 <span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 5316 <span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span> 5317 5318 <span class="comment">// observers</span> 5319 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span> 5320 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5321 5322 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5323 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span> 5324 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5325 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5326 5327 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5328 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span> 5329 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5330 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5331 5332 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 5333 5334 <span class="comment">// modifiers</span> 5335 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 5336 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 5337 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 5338 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&);</span> 5339<span class="special">};</span> 5340</pre> 5341<p> 5342 <code class="computeroutput"><span class="identifier">externally_locked</span></code> is 5343 a model of <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, it cloaks an object 5344 of type <code class="computeroutput"><span class="identifier">T</span></code>, and actually 5345 provides full access to that object through the get and set member functions, 5346 provided you pass a reference to a strict lock object. 5347 </p> 5348<p> 5349 Only the specificities respect to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> are described here. 5350 </p> 5351<div class="section"> 5352<div class="titlepage"><div><div><h6 class="title"> 5353<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor1" title="externally_locked(mutex_type&, const T&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&,</span> 5354 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span></code></a> 5355</h6></div></div></div> 5356<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">);</span> 5357</pre> 5358<div class="variablelist"> 5359<p class="title"><b></b></p> 5360<dl class="variablelist"> 5361<dt><span class="term">Requires:</span></dt> 5362<dd><p> 5363 T is a model of CopyConstructible. 5364 </p></dd> 5365<dt><span class="term">Effects:</span></dt> 5366<dd><p> 5367 Constructs an externally locked object copying the cloaked type. 5368 </p></dd> 5369<dt><span class="term">Throws:</span></dt> 5370<dd><p> 5371 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span></code>. 5372 </p></dd> 5373</dl> 5374</div> 5375</div> 5376<div class="section"> 5377<div class="titlepage"><div><div><h6 class="title"> 5378<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor2" title="externally_locked(mutex_type&, T&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&,</span> 5379 <span class="identifier">T</span><span class="special">&&)</span></code></a> 5380</h6></div></div></div> 5381<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">obj</span><span class="special">);</span> 5382</pre> 5383<div class="variablelist"> 5384<p class="title"><b></b></p> 5385<dl class="variablelist"> 5386<dt><span class="term">Requires:</span></dt> 5387<dd><p> 5388 T is a model of Movable. 5389 </p></dd> 5390<dt><span class="term">Effects:</span></dt> 5391<dd><p> 5392 Constructs an externally locked object by moving the cloaked 5393 type. 5394 </p></dd> 5395<dt><span class="term">Throws:</span></dt> 5396<dd><p> 5397 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span></code>. 5398 </p></dd> 5399</dl> 5400</div> 5401</div> 5402<div class="section"> 5403<div class="titlepage"><div><div><h6 class="title"> 5404<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor3" title="externally_locked(mutex_type&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&)</span></code></a> 5405</h6></div></div></div> 5406<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> 5407</pre> 5408<div class="variablelist"> 5409<p class="title"><b></b></p> 5410<dl class="variablelist"> 5411<dt><span class="term">Requires:</span></dt> 5412<dd><p> 5413 T is a model of DefaultConstructible. 5414 </p></dd> 5415<dt><span class="term">Effects:</span></dt> 5416<dd><p> 5417 Constructs an externally locked object by default constructing 5418 the cloaked type. 5419 </p></dd> 5420<dt><span class="term">Throws:</span></dt> 5421<dd><p> 5422 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">()</span></code>. 5423 </p></dd> 5424</dl> 5425</div> 5426</div> 5427<div class="section"> 5428<div class="titlepage"><div><div><h6 class="title"> 5429<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor4" title="externally_locked(externally_locked&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&)</span></code></a> 5430</h6></div></div></div> 5431<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span> 5432</pre> 5433<div class="variablelist"> 5434<p class="title"><b></b></p> 5435<dl class="variablelist"> 5436<dt><span class="term">Requires:</span></dt> 5437<dd><p> 5438 T is a model of Movable. 5439 </p></dd> 5440<dt><span class="term">Effects:</span></dt> 5441<dd><p> 5442 Move constructs an externally locked object by moving the cloaked 5443 type and copying the mutex reference 5444 </p></dd> 5445<dt><span class="term">Throws:</span></dt> 5446<dd><p> 5447 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&)</span></code>. 5448 </p></dd> 5449</dl> 5450</div> 5451</div> 5452<div class="section"> 5453<div class="titlepage"><div><div><h6 class="title"> 5454<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor5" title="externally_locked(externally_locked&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&)</span></code></a> 5455</h6></div></div></div> 5456<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 5457</pre> 5458<div class="variablelist"> 5459<p class="title"><b></b></p> 5460<dl class="variablelist"> 5461<dt><span class="term">Requires:</span></dt> 5462<dd><p> 5463 T is a model of Copyable. 5464 </p></dd> 5465<dt><span class="term">Effects:</span></dt> 5466<dd><p> 5467 Copy constructs an externally locked object by copying the cloaked 5468 type and copying the mutex reference 5469 </p></dd> 5470<dt><span class="term">Throws:</span></dt> 5471<dd><p> 5472 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&)</span></code>. 5473 </p></dd> 5474</dl> 5475</div> 5476</div> 5477<div class="section"> 5478<div class="titlepage"><div><div><h6 class="title"> 5479<a name="thread.synchronization.other_locks.externally_locked.externally_locked.assign4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.assign4" title="externally_locked(externally_locked&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&)</span></code></a> 5480</h6></div></div></div> 5481<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span> 5482</pre> 5483<div class="variablelist"> 5484<p class="title"><b></b></p> 5485<dl class="variablelist"> 5486<dt><span class="term">Requires:</span></dt> 5487<dd><p> 5488 T is a model of Movable. 5489 </p></dd> 5490<dt><span class="term">Effects:</span></dt> 5491<dd><p> 5492 Move assigns an externally locked object by moving the cloaked 5493 type and copying the mutex reference 5494 </p></dd> 5495<dt><span class="term">Throws:</span></dt> 5496<dd><p> 5497 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&&)</span></code>. 5498 </p></dd> 5499</dl> 5500</div> 5501</div> 5502<div class="section"> 5503<div class="titlepage"><div><div><h6 class="title"> 5504<a name="thread.synchronization.other_locks.externally_locked.externally_locked.assign5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.assign5" title="externally_locked(externally_locked&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&)</span></code></a> 5505</h6></div></div></div> 5506<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 5507</pre> 5508<div class="variablelist"> 5509<p class="title"><b></b></p> 5510<dl class="variablelist"> 5511<dt><span class="term">Requires:</span></dt> 5512<dd><p> 5513 T is a model of Copyable. 5514 </p></dd> 5515<dt><span class="term">Effects:</span></dt> 5516<dd><p> 5517 Copy assigns an externally locked object by copying the cloaked 5518 type and copying the mutex reference 5519 </p></dd> 5520<dt><span class="term">Throws:</span></dt> 5521<dd><p> 5522 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&)</span></code>. 5523 </p></dd> 5524</dl> 5525</div> 5526</div> 5527<div class="section"> 5528<div class="titlepage"><div><div><h6 class="title"> 5529<a name="thread.synchronization.other_locks.externally_locked.externally_locked.get1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get1" title="get(strict_lock<mutex_type>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&)</span></code></a> 5530</h6></div></div></div> 5531<pre class="programlisting"><span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span> 5532<span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5533</pre> 5534<div class="variablelist"> 5535<p class="title"><b></b></p> 5536<dl class="variablelist"> 5537<dt><span class="term">Requires:</span></dt> 5538<dd><p> 5539 The <code class="computeroutput"><span class="identifier">lk</span></code> parameter 5540 must be locking the associated mutex. 5541 </p></dd> 5542<dt><span class="term">Returns:</span></dt> 5543<dd><p> 5544 A reference to the cloaked object 5545 </p></dd> 5546<dt><span class="term">Throws:</span></dt> 5547<dd><p> 5548 <code class="computeroutput"><span class="identifier">lock_error</span></code> if 5549 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code> 5550 is defined and the run-time preconditions are not satisfied . 5551 </p></dd> 5552</dl> 5553</div> 5554</div> 5555<div class="section"> 5556<div class="titlepage"><div><div><h6 class="title"> 5557<a name="thread.synchronization.other_locks.externally_locked.externally_locked.get2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get2" title="get(nested_strict_lock<Lock>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&)</span></code></a> 5558</h6></div></div></div> 5559<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5560<span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span> 5561<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5562<span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5563</pre> 5564<div class="variablelist"> 5565<p class="title"><b></b></p> 5566<dl class="variablelist"> 5567<dt><span class="term">Requires:</span></dt> 5568<dd><p> 5569 <code class="computeroutput"><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">,</span> 5570 <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">></span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code> 5571 parameter must be locking the associated mutex. 5572 </p></dd> 5573<dt><span class="term">Returns:</span></dt> 5574<dd><p> 5575 A reference to the cloaked object 5576 </p></dd> 5577<dt><span class="term">Throws:</span></dt> 5578<dd><p> 5579 <code class="computeroutput"><span class="identifier">lock_error</span></code> if 5580 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code> 5581 is defined and the run-time preconditions are not satisfied . 5582 </p></dd> 5583</dl> 5584</div> 5585</div> 5586<div class="section"> 5587<div class="titlepage"><div><div><h6 class="title"> 5588<a name="thread.synchronization.other_locks.externally_locked.externally_locked.get3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get3" title="get(Lock&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&)</span></code></a> 5589</h6></div></div></div> 5590<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5591<span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span> 5592<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5593<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5594</pre> 5595<div class="variablelist"> 5596<p class="title"><b></b></p> 5597<dl class="variablelist"> 5598<dt><span class="term">Requires:</span></dt> 5599<dd><p> 5600 <code class="computeroutput"><span class="identifier">Lock</span></code> is a model 5601 of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>, <code class="computeroutput"><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">,</span> 5602 <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">></span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code> 5603 parameter must be locking the associated mutex. 5604 </p></dd> 5605<dt><span class="term">Returns:</span></dt> 5606<dd><p> 5607 A reference to the cloaked object 5608 </p></dd> 5609<dt><span class="term">Throws:</span></dt> 5610<dd><p> 5611 <code class="computeroutput"><span class="identifier">lock_error</span></code> if 5612 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code> 5613 is defined and the run-time preconditions are not satisfied . 5614 </p></dd> 5615</dl> 5616</div> 5617</div> 5618</div> 5619<div class="section"> 5620<div class="titlepage"><div><div><h5 class="title"> 5621<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref" title="Template Class externally_locked<T&>">Template 5622 Class <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&></span></code></a> 5623</h5></div></div></div> 5624<pre class="programlisting"><span class="comment">// #include <boost/thread/externally_locked.hpp></span> 5625 5626<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span> 5627<span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&,</span> <span class="identifier">MutexType</span><span class="special">></span> 5628<span class="special">{</span> 5629 <span class="comment">//BOOST_CONCEPT_ASSERT(( CopyConstructible<T> ));</span> 5630 <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span> <span class="identifier">BasicLockable</span><span class="special"><</span><span class="identifier">MutexType</span><span class="special">></span> <span class="special">));</span> 5631 5632<span class="keyword">public</span><span class="special">:</span> 5633 <span class="keyword">typedef</span> <span class="identifier">MutexType</span> <span class="identifier">mutex_type</span><span class="special">;</span> 5634 5635 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">);</span> 5636 <span class="keyword">explicit</span> <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> 5637 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 5638 <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 5639 <span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 5640 <span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 5641 5642 <span class="comment">// observers</span> 5643 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span> 5644 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5645 5646 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5647 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span> 5648 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5649 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5650 5651 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5652 <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span> 5653 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5654 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5655 5656 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 5657 5658 <span class="comment">// modifiers</span> 5659 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 5660 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 5661 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 5662 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&)</span> <span class="keyword">noexcept</span><span class="special">;</span> 5663<span class="special">};</span> 5664</pre> 5665<p> 5666 <code class="computeroutput"><span class="identifier">externally_locked</span></code> is 5667 a model of <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, it cloaks an object 5668 of type <code class="computeroutput"><span class="identifier">T</span></code>, and actually 5669 provides full access to that object through the get and set member functions, 5670 provided you pass a reference to a strict lock object. 5671 </p> 5672<p> 5673 Only the specificities respect to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> are described here. 5674 </p> 5675<div class="section"> 5676<div class="titlepage"><div><div><h6 class="title"> 5677<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor1" title="externally_locked<T&>(mutex_type&, T&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>(</span><span class="identifier">mutex_type</span><span class="special">&,</span> 5678 <span class="identifier">T</span><span class="special">&)</span></code></a> 5679</h6></div></div></div> 5680<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>(</span><span class="identifier">mutex_type</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">obj</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 5681</pre> 5682<div class="variablelist"> 5683<p class="title"><b></b></p> 5684<dl class="variablelist"> 5685<dt><span class="term">Effects:</span></dt> 5686<dd><p> 5687 Constructs an externally locked object copying the cloaked reference. 5688 </p></dd> 5689</dl> 5690</div> 5691</div> 5692<div class="section"> 5693<div class="titlepage"><div><div><h6 class="title"> 5694<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor4" title="externally_locked<T&>(externally_locked&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">&>(</span><span class="identifier">externally_locked</span><span class="special">&&)</span></code></a> 5695</h6></div></div></div> 5696<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 5697</pre> 5698<div class="variablelist"> 5699<p class="title"><b></b></p> 5700<dl class="variablelist"> 5701<dt><span class="term">Effects:</span></dt> 5702<dd><p> 5703 Moves an externally locked object by moving the cloaked type 5704 and copying the mutex reference 5705 </p></dd> 5706</dl> 5707</div> 5708</div> 5709<div class="section"> 5710<div class="titlepage"><div><div><h6 class="title"> 5711<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign4" title="externally_locked(externally_locked&&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&&)</span></code></a> 5712</h6></div></div></div> 5713<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">);</span> 5714</pre> 5715<div class="variablelist"> 5716<p class="title"><b></b></p> 5717<dl class="variablelist"> 5718<dt><span class="term">Effects:</span></dt> 5719<dd><p> 5720 Move assigns an externally locked object by copying the cloaked 5721 reference and copying the mutex reference 5722 </p></dd> 5723</dl> 5724</div> 5725</div> 5726<div class="section"> 5727<div class="titlepage"><div><div><h6 class="title"> 5728<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign5" title="externally_locked(externally_locked&)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&)</span></code></a> 5729</h6></div></div></div> 5730<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">);</span> 5731</pre> 5732<div class="variablelist"> 5733<p class="title"><b></b></p> 5734<dl class="variablelist"> 5735<dt><span class="term">Requires:</span></dt> 5736<dd><p> 5737 T is a model of Copyable. 5738 </p></dd> 5739<dt><span class="term">Effects:</span></dt> 5740<dd><p> 5741 Copy assigns an externally locked object by copying the cloaked 5742 reference and copying the mutex reference 5743 </p></dd> 5744<dt><span class="term">Throws:</span></dt> 5745<dd><p> 5746 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&)</span></code>. 5747 </p></dd> 5748</dl> 5749</div> 5750</div> 5751<div class="section"> 5752<div class="titlepage"><div><div><h6 class="title"> 5753<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get1" title="get(strict_lock<mutex_type>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&)</span></code></a> 5754</h6></div></div></div> 5755<pre class="programlisting"><span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span> 5756<span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5757</pre> 5758<div class="variablelist"> 5759<p class="title"><b></b></p> 5760<dl class="variablelist"> 5761<dt><span class="term">Requires:</span></dt> 5762<dd><p> 5763 The <code class="computeroutput"><span class="identifier">lk</span></code> parameter 5764 must be locking the associated mutex. 5765 </p></dd> 5766<dt><span class="term">Returns:</span></dt> 5767<dd><p> 5768 A reference to the cloaked object 5769 </p></dd> 5770<dt><span class="term">Throws:</span></dt> 5771<dd><p> 5772 <code class="computeroutput"><span class="identifier">lock_error</span></code> if 5773 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code> 5774 is defined and the run-time preconditions are not satisfied . 5775 </p></dd> 5776</dl> 5777</div> 5778</div> 5779<div class="section"> 5780<div class="titlepage"><div><div><h6 class="title"> 5781<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get2" title="get(nested_strict_lock<Lock>&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&)</span></code></a> 5782</h6></div></div></div> 5783<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5784<span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">);</span> 5785<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5786<span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special"><</span><span class="identifier">Lock</span><span class="special">>&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5787</pre> 5788<div class="variablelist"> 5789<p class="title"><b></b></p> 5790<dl class="variablelist"> 5791<dt><span class="term">Requires:</span></dt> 5792<dd><p> 5793 <code class="computeroutput"><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">,</span> 5794 <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">></span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code> 5795 parameter must be locking the associated mutex. 5796 </p></dd> 5797<dt><span class="term">Returns:</span></dt> 5798<dd><p> 5799 A reference to the cloaked object 5800 </p></dd> 5801<dt><span class="term">Throws:</span></dt> 5802<dd><p> 5803 <code class="computeroutput"><span class="identifier">lock_error</span></code> if 5804 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code> 5805 is defined and the run-time preconditions are not satisfied . 5806 </p></dd> 5807</dl> 5808</div> 5809</div> 5810<div class="section"> 5811<div class="titlepage"><div><div><h6 class="title"> 5812<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get3" title="get(Lock&)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&)</span></code></a> 5813</h6></div></div></div> 5814<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5815<span class="identifier">T</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">);</span> 5816<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">></span> 5817<span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> 5818</pre> 5819<div class="variablelist"> 5820<p class="title"><b></b></p> 5821<dl class="variablelist"> 5822<dt><span class="term">Requires:</span></dt> 5823<dd><p> 5824 <code class="computeroutput"><span class="identifier">Lock</span></code> is a model 5825 of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>, <code class="computeroutput"><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">mutex_type</span><span class="special">,</span> 5826 <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">></span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code> 5827 parameter must be locking the associated mutex. 5828 </p></dd> 5829<dt><span class="term">Returns:</span></dt> 5830<dd><p> 5831 A reference to the cloaked object 5832 </p></dd> 5833<dt><span class="term">Throws:</span></dt> 5834<dd><p> 5835 <code class="computeroutput"><span class="identifier">lock_error</span></code> if 5836 <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code> 5837 is defined and the run-time preconditions are not satisfied . 5838 </p></dd> 5839</dl> 5840</div> 5841</div> 5842</div> 5843<div class="section"> 5844<div class="titlepage"><div><div><h5 class="title"> 5845<a name="thread.synchronization.other_locks.externally_locked.swap"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.swap" title="swap(externally_locked&, externally_locked&)"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&,</span> 5846 <span class="identifier">externally_locked</span><span class="special">&)</span></code></a> 5847</h5></div></div></div> 5848<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">MutexType</span><span class="special">></span> 5849<span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">></span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">externally_locked</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">></span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> 5850</pre> 5851</div> 5852</div> 5853<div class="section"> 5854<div class="titlepage"><div><div><h4 class="title"> 5855<a name="thread.synchronization.other_locks.shared_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard">Class 5856 template <code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a> 5857</h4></div></div></div> 5858<div class="toc"><dl class="toc"> 5859<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span> 5860 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt> 5861<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor_adopt"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span> 5862 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt> 5863<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">()</span></code></a></span></dt> 5864</dl></div> 5865<pre class="programlisting"><span class="comment">// #include <boost/thread/shared_lock_guard.hpp></span> 5866<span class="keyword">namespace</span> <span class="identifier">boost</span> 5867<span class="special">{</span> 5868 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">SharedLockable</span><span class="special">></span> 5869 <span class="keyword">class</span> <span class="identifier">shared_lock_guard</span> 5870 <span class="special">{</span> 5871 <span class="keyword">public</span><span class="special">:</span> 5872 <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">shared_lock_guard</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 5873 <span class="identifier">shared_lock_guard</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_lock_guard</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 5874 5875 <span class="keyword">explicit</span> <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span> 5876 <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">);</span> 5877 5878 <span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">();</span> 5879 <span class="special">};</span> 5880<span class="special">}</span> 5881</pre> 5882<p> 5883 <a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard"><code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a> is very simple: 5884 on construction it acquires shared ownership of the implementation of the 5885 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> supplied 5886 as the constructor parameter. On destruction, the ownership is released. 5887 This provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> object, to facilitate 5888 exception-safe shared locking and unlocking. In addition, the <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard"><code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code> constructor allows the <a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard"><code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a> object to take 5889 shared ownership of a lock already held by the current thread. 5890 </p> 5891<div class="section"> 5892<div class="titlepage"><div><div><h5 class="title"> 5893<a name="thread.synchronization.other_locks.shared_lock_guard.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor" title="shared_lock_guard(SharedLockable & m)"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span> 5894 <span class="identifier">m</span><span class="special">)</span></code></a> 5895</h5></div></div></div> 5896<div class="variablelist"> 5897<p class="title"><b></b></p> 5898<dl class="variablelist"> 5899<dt><span class="term">Effects:</span></dt> 5900<dd><p> 5901 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 5902 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>. 5903 </p></dd> 5904<dt><span class="term">Throws:</span></dt> 5905<dd><p> 5906 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>. 5907 </p></dd> 5908</dl> 5909</div> 5910</div> 5911<div class="section"> 5912<div class="titlepage"><div><div><h5 class="title"> 5913<a name="thread.synchronization.other_locks.shared_lock_guard.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor_adopt" title="shared_lock_guard(SharedLockable & m,boost::adopt_lock_t)"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&</span> 5914 <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a> 5915</h5></div></div></div> 5916<div class="variablelist"> 5917<p class="title"><b></b></p> 5918<dl class="variablelist"> 5919<dt><span class="term">Precondition:</span></dt> 5920<dd><p> 5921 The current thread owns a lock on <code class="computeroutput"><span class="identifier">m</span></code> 5922 equivalent to one obtained by a call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>. 5923 </p></dd> 5924<dt><span class="term">Effects:</span></dt> 5925<dd><p> 5926 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 5927 Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>. 5928 </p></dd> 5929<dt><span class="term">Throws:</span></dt> 5930<dd><p> 5931 Nothing. 5932 </p></dd> 5933</dl> 5934</div> 5935</div> 5936<div class="section"> 5937<div class="titlepage"><div><div><h5 class="title"> 5938<a name="thread.synchronization.other_locks.shared_lock_guard.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.destructor" title="~shared_lock_guard()"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">()</span></code></a> 5939</h5></div></div></div> 5940<div class="variablelist"> 5941<p class="title"><b></b></p> 5942<dl class="variablelist"> 5943<dt><span class="term">Effects:</span></dt> 5944<dd><p> 5945 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code> on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> object 5946 passed to the constructor. 5947 </p></dd> 5948<dt><span class="term">Throws:</span></dt> 5949<dd><p> 5950 Nothing. 5951 </p></dd> 5952</dl> 5953</div> 5954</div> 5955</div> 5956<div class="section"> 5957<div class="titlepage"><div><div><h4 class="title"> 5958<a name="thread.synchronization.other_locks.reverse_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock">Class 5959 template <code class="computeroutput"><span class="identifier">reverse_lock</span></code></a> 5960</h4></div></div></div> 5961<div class="toc"><dl class="toc"> 5962<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock.constructor"><code class="computeroutput"><span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&</span> 5963 <span class="identifier">m</span><span class="special">)</span></code></a></span></dt> 5964<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">()</span></code></a></span></dt> 5965</dl></div> 5966<pre class="programlisting"><span class="comment">// #include <boost/thread/reverse_lock.hpp></span> 5967<span class="keyword">namespace</span> <span class="identifier">boost</span> 5968<span class="special">{</span> 5969 5970 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">></span> 5971 <span class="keyword">class</span> <span class="identifier">reverse_lock</span> 5972 <span class="special">{</span> 5973 <span class="keyword">public</span><span class="special">:</span> 5974 <span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">reverse_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 5975 <span class="identifier">reverse_lock</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">reverse_lock</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 5976 5977 <span class="keyword">explicit</span> <span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&</span> <span class="identifier">m_</span><span class="special">);</span> 5978 <span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">();</span> 5979 <span class="special">};</span> 5980<span class="special">}</span> 5981</pre> 5982<p> 5983 <a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock"><code class="computeroutput"><span class="identifier">reverse_lock</span></code></a> reverse the operations 5984 of a lock: it provide for RAII-style, that unlocks the lock at construction 5985 time and lock it at destruction time. In addition, it transfer ownership 5986 temporarily, so that the mutex can not be locked using the Lock. 5987 </p> 5988<p> 5989 An instance of <a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock"><code class="computeroutput"><span class="identifier">reverse_lock</span></code></a> doesn't <span class="emphasis"><em>own</em></span> 5990 the lock never. 5991 </p> 5992<div class="section"> 5993<div class="titlepage"><div><div><h5 class="title"> 5994<a name="thread.synchronization.other_locks.reverse_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock.constructor" title="reverse_lock(Lock & m)"><code class="computeroutput"><span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&</span> 5995 <span class="identifier">m</span><span class="special">)</span></code></a> 5996</h5></div></div></div> 5997<div class="variablelist"> 5998<p class="title"><b></b></p> 5999<dl class="variablelist"> 6000<dt><span class="term">Effects:</span></dt> 6001<dd><p> 6002 Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>. 6003 Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code> 6004 if <code class="computeroutput"><span class="identifier">m</span></code> owns his lock 6005 and then stores the mutex by calling <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. 6006 </p></dd> 6007<dt><span class="term">Postcondition:</span></dt> 6008<dd><p> 6009 <code class="computeroutput"><span class="special">!</span><span class="identifier">m</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span> <span class="special">&&</span> 6010 <span class="identifier">m</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()==</span><span class="number">0</span></code>. 6011 </p></dd> 6012<dt><span class="term">Throws:</span></dt> 6013<dd><p> 6014 Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>. 6015 </p></dd> 6016</dl> 6017</div> 6018</div> 6019<div class="section"> 6020<div class="titlepage"><div><div><h5 class="title"> 6021<a name="thread.synchronization.other_locks.reverse_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock.destructor" title="~reverse_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">()</span></code></a> 6022</h5></div></div></div> 6023<div class="variablelist"> 6024<p class="title"><b></b></p> 6025<dl class="variablelist"> 6026<dt><span class="term">Effects:</span></dt> 6027<dd><p> 6028 Let be mtx the stored mutex*. If not 0 Invokes <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-></span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">()</span></code> 6029 and gives again the <code class="computeroutput"><span class="identifier">mtx</span></code> 6030 to the <code class="computeroutput"><span class="identifier">Lock</span></code> using 6031 the <code class="computeroutput"><span class="identifier">adopt_lock_t</span></code> 6032 overload. 6033 </p></dd> 6034<dt><span class="term">Throws:</span></dt> 6035<dd><p> 6036 Any exception thrown by <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-></span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">()</span></code>. 6037 </p></dd> 6038<dt><span class="term">Remarks:</span></dt> 6039<dd><p> 6040 Note that if <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-></span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">()</span></code> 6041 throws an exception while unwinding the program will terminate, 6042 so don't use reverse_lock if an exception can be thrown. 6043 </p></dd> 6044</dl> 6045</div> 6046</div> 6047</div> 6048</div> 6049<div class="section"> 6050<div class="titlepage"><div><div><h3 class="title"> 6051<a name="thread.synchronization.lock_functions"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions" title="Lock functions">Lock functions</a> 6052</h3></div></div></div> 6053<div class="toc"><dl class="toc"> 6054<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.lock_multiple">Non-member 6055 function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a></span></dt> 6056<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.lock_range">Non-member 6057 function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> // 6058 EXTENSION</a></span></dt> 6059<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.try_lock_multiple">Non-member 6060 function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a></span></dt> 6061<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.try_lock_range">Non-member 6062 function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> // 6063 EXTENSION</a></span></dt> 6064</dl></div> 6065<div class="section"> 6066<div class="titlepage"><div><div><h4 class="title"> 6067<a name="thread.synchronization.lock_functions.lock_multiple"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.lock_multiple" title="Non-member function lock(Lockable1,Lockable2,...)">Non-member 6068 function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a> 6069</h4></div></div></div> 6070<pre class="programlisting"><span class="comment">// #include <boost/thread/locks.hpp></span> 6071<span class="comment">// #include <boost/thread/lock_algorithms.hpp></span> 6072<span class="keyword">namespace</span> <span class="identifier">boost</span> 6073<span class="special">{</span> 6074 6075 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">></span> 6076 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">);</span> 6077 6078 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">></span> 6079 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">);</span> 6080 6081 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable4</span><span class="special">></span> 6082 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&</span> <span class="identifier">l4</span><span class="special">);</span> 6083 6084 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable4</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable5</span><span class="special">></span> 6085 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&</span> <span class="identifier">l4</span><span class="special">,</span><span class="identifier">Lockable5</span><span class="special">&</span> <span class="identifier">l5</span><span class="special">);</span> 6086 6087<span class="special">}</span> 6088</pre> 6089<div class="variablelist"> 6090<p class="title"><b></b></p> 6091<dl class="variablelist"> 6092<dt><span class="term">Effects:</span></dt> 6093<dd><p> 6094 Locks the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects supplied 6095 as arguments in an unspecified and indeterminate order in a way that 6096 avoids deadlock. It is safe to call this function concurrently from 6097 multiple threads for any set of mutexes (or other lockable objects) 6098 in any order without risk of deadlock. If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 6099 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6100 operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws 6101 an exception any locks acquired by the function will be released 6102 before the function exits. 6103 </p></dd> 6104<dt><span class="term">Throws:</span></dt> 6105<dd><p> 6106 Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 6107 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6108 on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects. 6109 </p></dd> 6110<dt><span class="term">Postcondition:</span></dt> 6111<dd><p> 6112 All the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are locked 6113 by the calling thread. 6114 </p></dd> 6115</dl> 6116</div> 6117</div> 6118<div class="section"> 6119<div class="titlepage"><div><div><h4 class="title"> 6120<a name="thread.synchronization.lock_functions.lock_range"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.lock_range" title="Non-member function lock(begin,end) // EXTENSION">Non-member 6121 function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> // 6122 EXTENSION</a> 6123</h4></div></div></div> 6124<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">></span> 6125<span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">ForwardIterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">ForwardIterator</span> <span class="identifier">end</span><span class="special">);</span> 6126</pre> 6127<div class="variablelist"> 6128<p class="title"><b></b></p> 6129<dl class="variablelist"> 6130<dt><span class="term">Preconditions:</span></dt> 6131<dd><p> 6132 The <code class="computeroutput"><span class="identifier">value_type</span></code> of 6133 <code class="computeroutput"><span class="identifier">ForwardIterator</span></code> must 6134 implement the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> 6135 </p></dd> 6136<dt><span class="term">Effects:</span></dt> 6137<dd><p> 6138 Locks all the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the 6139 supplied range in an unspecified and indeterminate order in a way 6140 that avoids deadlock. It is safe to call this function concurrently 6141 from multiple threads for any set of mutexes (or other lockable objects) 6142 in any order without risk of deadlock. If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 6143 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6144 operations on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the 6145 supplied range throws an exception any locks acquired by the function 6146 will be released before the function exits. 6147 </p></dd> 6148<dt><span class="term">Throws:</span></dt> 6149<dd><p> 6150 Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 6151 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6152 on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects. 6153 </p></dd> 6154<dt><span class="term">Postcondition:</span></dt> 6155<dd><p> 6156 All the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the 6157 supplied range are locked by the calling thread. 6158 </p></dd> 6159</dl> 6160</div> 6161</div> 6162<div class="section"> 6163<div class="titlepage"><div><div><h4 class="title"> 6164<a name="thread.synchronization.lock_functions.try_lock_multiple"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.try_lock_multiple" title="Non-member function try_lock(Lockable1,Lockable2,...)">Non-member 6165 function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a> 6166</h4></div></div></div> 6167<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">></span> 6168<span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">);</span> 6169 6170<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">></span> 6171<span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">);</span> 6172 6173<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable4</span><span class="special">></span> 6174<span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&</span> <span class="identifier">l4</span><span class="special">);</span> 6175 6176<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable4</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Lockable5</span><span class="special">></span> 6177<span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&</span> <span class="identifier">l4</span><span class="special">,</span><span class="identifier">Lockable5</span><span class="special">&</span> <span class="identifier">l5</span><span class="special">);</span> 6178</pre> 6179<div class="variablelist"> 6180<p class="title"><b></b></p> 6181<dl class="variablelist"> 6182<dt><span class="term">Effects:</span></dt> 6183<dd> 6184<p> 6185 Calls <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6186 on each of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects supplied 6187 as arguments. If any of the calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6188 returns <code class="computeroutput"><span class="keyword">false</span></code> then all 6189 locks acquired are released and the zero-based index of the failed 6190 lock is returned. 6191 </p> 6192<p> 6193 If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6194 operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws 6195 an exception any locks acquired by the function will be released 6196 before the function exits. 6197 </p> 6198</dd> 6199<dt><span class="term">Returns:</span></dt> 6200<dd><p> 6201 <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code> 6202 if all the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are now 6203 locked by the calling thread, the zero-based index of the object 6204 which could not be locked otherwise. 6205 </p></dd> 6206<dt><span class="term">Throws:</span></dt> 6207<dd><p> 6208 Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6209 on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects. 6210 </p></dd> 6211<dt><span class="term">Postcondition:</span></dt> 6212<dd><p> 6213 If the function returns <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>, all the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are locked 6214 by the calling thread. Otherwise any locks acquired by this function 6215 will have been released. 6216 </p></dd> 6217</dl> 6218</div> 6219</div> 6220<div class="section"> 6221<div class="titlepage"><div><div><h4 class="title"> 6222<a name="thread.synchronization.lock_functions.try_lock_range"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.try_lock_range" title="Non-member function try_lock(begin,end) // EXTENSION">Non-member 6223 function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> // 6224 EXTENSION</a> 6225</h4></div></div></div> 6226<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">></span> 6227<span class="identifier">ForwardIterator</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">ForwardIterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">ForwardIterator</span> <span class="identifier">end</span><span class="special">);</span> 6228</pre> 6229<div class="variablelist"> 6230<p class="title"><b></b></p> 6231<dl class="variablelist"> 6232<dt><span class="term">Preconditions:</span></dt> 6233<dd><p> 6234 The <code class="computeroutput"><span class="identifier">value_type</span></code> of 6235 <code class="computeroutput"><span class="identifier">ForwardIterator</span></code> must 6236 implement the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> 6237 </p></dd> 6238<dt><span class="term">Effects:</span></dt> 6239<dd> 6240<p> 6241 Calls <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6242 on each of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the 6243 supplied range. If any of the calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6244 returns <code class="computeroutput"><span class="keyword">false</span></code> then all 6245 locks acquired are released and an iterator referencing the failed 6246 lock is returned. 6247 </p> 6248<p> 6249 If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6250 operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws 6251 an exception any locks acquired by the function will be released 6252 before the function exits. 6253 </p> 6254</dd> 6255<dt><span class="term">Returns:</span></dt> 6256<dd><p> 6257 <code class="computeroutput"><span class="identifier">end</span></code> if all the supplied 6258 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are now 6259 locked by the calling thread, an iterator referencing the object 6260 which could not be locked otherwise. 6261 </p></dd> 6262<dt><span class="term">Throws:</span></dt> 6263<dd><p> 6264 Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6265 on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects. 6266 </p></dd> 6267<dt><span class="term">Postcondition:</span></dt> 6268<dd><p> 6269 If the function returns <code class="computeroutput"><span class="identifier">end</span></code> 6270 then all the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the 6271 supplied range are locked by the calling thread, otherwise all locks 6272 acquired by the function have been released. 6273 </p></dd> 6274</dl> 6275</div> 6276</div> 6277</div> 6278<div class="section"> 6279<div class="titlepage"><div><div><h3 class="title"> 6280<a name="thread.synchronization.lock_factories"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories" title="Lock Factories - EXTENSION">Lock Factories 6281 - EXTENSION</a> 6282</h3></div></div></div> 6283<div class="toc"><dl class="toc"> 6284<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock">Non 6285 Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&)</span></code></a></span></dt> 6286<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock_t">Non 6287 Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&,</span><span class="identifier">tag</span><span class="special">)</span></code></a></span></dt> 6288<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_locks">Non 6289 Member Function <code class="computeroutput"><span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="special">...)</span></code></a></span></dt> 6290</dl></div> 6291<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> 6292<span class="special">{</span> 6293 6294 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 6295 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6296 6297 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 6298 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6299 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 6300 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">defer_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6301 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 6302 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6303 6304<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_NO_MAKE_UNIQUE_LOCKS</span><span class="special">)</span> 6305 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Lockable</span><span class="special">></span> 6306 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">...></span> <span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="special">...</span><span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6307<span class="preprocessor">#endif</span> 6308<span class="special">}</span> 6309</pre> 6310<div class="section"> 6311<div class="titlepage"><div><div><h4 class="title"> 6312<a name="thread.synchronization.lock_factories.make_unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock" title="Non Member Function make_unique_lock(Lockable&)">Non 6313 Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&)</span></code></a> 6314</h4></div></div></div> 6315<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 6316<span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6317</pre> 6318<div class="variablelist"> 6319<p class="title"><b></b></p> 6320<dl class="variablelist"> 6321<dt><span class="term">Returns:</span></dt> 6322<dd><p> 6323 a <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> as if initialized 6324 with <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>(</span><span class="identifier">mtx</span><span class="special">)</span></code>. 6325 </p></dd> 6326<dt><span class="term">Throws:</span></dt> 6327<dd><p> 6328 Any exception thrown by the call to <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>(</span><span class="identifier">mtx</span><span class="special">)</span></code>. 6329 </p></dd> 6330</dl> 6331</div> 6332</div> 6333<div class="section"> 6334<div class="titlepage"><div><div><h4 class="title"> 6335<a name="thread.synchronization.lock_factories.make_unique_lock_t"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock_t" title="Non Member Function make_unique_lock(Lockable&,tag)">Non 6336 Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&,</span><span class="identifier">tag</span><span class="special">)</span></code></a> 6337</h4></div></div></div> 6338<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 6339<span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6340 6341<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 6342<span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">defer_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6343 6344<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">></span> 6345<span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">tag</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6346</pre> 6347<div class="variablelist"> 6348<p class="title"><b></b></p> 6349<dl class="variablelist"> 6350<dt><span class="term">Returns:</span></dt> 6351<dd><p> 6352 a <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> as if initialized 6353 with <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>(</span><span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">tag</span><span class="special">)</span></code>. 6354 </p></dd> 6355<dt><span class="term">Throws:</span></dt> 6356<dd><p> 6357 Any exception thrown by the call to <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>(</span><span class="identifier">mtx</span><span class="special">,</span> 6358 <span class="identifier">tag</span><span class="special">)</span></code>. 6359 </p></dd> 6360</dl> 6361</div> 6362</div> 6363<div class="section"> 6364<div class="titlepage"><div><div><h4 class="title"> 6365<a name="thread.synchronization.lock_factories.make_unique_locks"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_locks" title="Non Member Function make_unique_locks(Lockable& ...)">Non 6366 Member Function <code class="computeroutput"><span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="special">...)</span></code></a> 6367</h4></div></div></div> 6368<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Lockable</span><span class="special">></span> 6369<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">></span> <span class="special">...></span> <span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&</span> <span class="special">...</span><span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 6370</pre> 6371<div class="variablelist"> 6372<p class="title"><b></b></p> 6373<dl class="variablelist"> 6374<dt><span class="term">Effect:</span></dt> 6375<dd><p> 6376 Locks all the mutexes. 6377 </p></dd> 6378<dt><span class="term">Returns:</span></dt> 6379<dd><p> 6380 a std::tuple of unique <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> owning each 6381 one of the mutex. 6382 </p></dd> 6383<dt><span class="term">Throws:</span></dt> 6384<dd><p> 6385 Any exception thrown by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock</span><span class="special">(</span><span class="identifier">mtx</span><span class="special">...)</span></code>. 6386 </p></dd> 6387</dl> 6388</div> 6389</div> 6390</div> 6391<div class="section"> 6392<div class="titlepage"><div><div><h3 class="title"> 6393<a name="thread.synchronization.mutex_types"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types" title="Mutex Types">Mutex Types</a> 6394</h3></div></div></div> 6395<div class="toc"><dl class="toc"> 6396<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.mutex">Class <code class="computeroutput"><span class="identifier">mutex</span></code></a></span></dt> 6397<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.try_mutex">Typedef 6398 <code class="computeroutput"><span class="identifier">try_mutex</span></code></a></span></dt> 6399<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.timed_mutex">Class 6400 <code class="computeroutput"><span class="identifier">timed_mutex</span></code></a></span></dt> 6401<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex">Class 6402 <code class="computeroutput"><span class="identifier">recursive_mutex</span></code></a></span></dt> 6403<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex">Typedef 6404 <code class="computeroutput"><span class="identifier">recursive_try_mutex</span></code></a></span></dt> 6405<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex">Class 6406 <code class="computeroutput"><span class="identifier">recursive_timed_mutex</span></code></a></span></dt> 6407<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.shared_mutex">Class 6408 <code class="computeroutput"><span class="identifier">shared_mutex</span></code> -- C++14</a></span></dt> 6409<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.upgrade_mutex">Class 6410 <code class="computeroutput"><span class="identifier">upgrade_mutex</span></code> -- EXTENSION</a></span></dt> 6411<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.null_mutex">Class 6412 <code class="computeroutput"><span class="identifier">null_mutex</span></code> -- EXTENSION</a></span></dt> 6413</dl></div> 6414<div class="section"> 6415<div class="titlepage"><div><div><h4 class="title"> 6416<a name="thread.synchronization.mutex_types.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex">Class <code class="computeroutput"><span class="identifier">mutex</span></code></a> 6417</h4></div></div></div> 6418<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.mutex.nativehandle">Member 6419 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div> 6420<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">mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6421 6422<span class="keyword">class</span> <span class="identifier">mutex</span><span class="special">:</span> 6423 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span> 6424<span class="special">{</span> 6425<span class="keyword">public</span><span class="special">:</span> 6426 <span class="identifier">mutex</span><span class="special">();</span> 6427 <span class="special">~</span><span class="identifier">mutex</span><span class="special">();</span> 6428 6429 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 6430 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 6431 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 6432 6433 <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> 6434 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 6435 6436 <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">scoped_lock</span><span class="special">;</span> 6437 <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span> 6438<span class="special">};</span> 6439</pre> 6440<p> 6441 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a> implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to provide an 6442 exclusive-ownership mutex. At most one thread can own the lock on a given 6443 instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a> at any time. Multiple concurrent 6444 calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>, 6445 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6446 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 6447 shall be permitted. 6448 </p> 6449<div class="section"> 6450<div class="titlepage"><div><div><h5 class="title"> 6451<a name="thread.synchronization.mutex_types.mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex.nativehandle" title="Member function native_handle()">Member 6452 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a> 6453</h5></div></div></div> 6454<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> 6455<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 6456</pre> 6457<div class="variablelist"> 6458<p class="title"><b></b></p> 6459<dl class="variablelist"> 6460<dt><span class="term">Effects:</span></dt> 6461<dd><p> 6462 Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code> 6463 that can be used with platform-specific APIs to manipulate the 6464 underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code> 6465 and <code class="computeroutput"><span class="identifier">native_handle_type</span></code> 6466 are not present. 6467 </p></dd> 6468<dt><span class="term">Throws:</span></dt> 6469<dd><p> 6470 Nothing. 6471 </p></dd> 6472</dl> 6473</div> 6474</div> 6475</div> 6476<div class="section"> 6477<div class="titlepage"><div><div><h4 class="title"> 6478<a name="thread.synchronization.mutex_types.try_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.try_mutex" title="Typedef try_mutex">Typedef 6479 <code class="computeroutput"><span class="identifier">try_mutex</span></code></a> 6480</h4></div></div></div> 6481<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">mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6482 6483<span class="keyword">typedef</span> <span class="identifier">mutex</span> <span class="identifier">try_mutex</span><span class="special">;</span> 6484</pre> 6485<p> 6486 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.try_mutex" title="Typedef try_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_mutex</span></code></a> is a <code class="computeroutput"><span class="keyword">typedef</span></code> 6487 to <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a>, provided for backwards 6488 compatibility with previous releases of boost. 6489 </p> 6490</div> 6491<div class="section"> 6492<div class="titlepage"><div><div><h4 class="title"> 6493<a name="thread.synchronization.mutex_types.timed_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex">Class 6494 <code class="computeroutput"><span class="identifier">timed_mutex</span></code></a> 6495</h4></div></div></div> 6496<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.timed_mutex.nativehandle">Member 6497 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div> 6498<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">mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6499 6500<span class="keyword">class</span> <span class="identifier">timed_mutex</span><span class="special">:</span> 6501 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span> 6502<span class="special">{</span> 6503<span class="keyword">public</span><span class="special">:</span> 6504 <span class="identifier">timed_mutex</span><span class="special">();</span> 6505 <span class="special">~</span><span class="identifier">timed_mutex</span><span class="special">();</span> 6506 6507 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 6508 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 6509 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 6510 6511 <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> 6512 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6513 <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> 6514 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6515 6516 <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> 6517 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 6518 6519 <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">timed_mutex</span><span class="special">></span> <span class="identifier">scoped_timed_lock</span><span class="special">;</span> 6520 <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span> 6521 <span class="keyword">typedef</span> <span class="identifier">scoped_timed_lock</span> <span class="identifier">scoped_lock</span><span class="special">;</span> 6522 6523<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span> 6524 <span class="keyword">bool</span> <span class="identifier">timed_lock</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> 6525 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span> 6526 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">relative_time</span><span class="special">);</span> 6527<span class="preprocessor">#endif</span> 6528 6529<span class="special">};</span> 6530</pre> 6531<p> 6532 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span></code></a> implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> to provide 6533 an exclusive-ownership mutex. At most one thread can own the lock on a 6534 given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span></code></a> at any time. Multiple 6535 concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>, 6536 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>, 6537 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>, 6538 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a> 6539 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 6540 shall be permitted. 6541 </p> 6542<div class="section"> 6543<div class="titlepage"><div><div><h5 class="title"> 6544<a name="thread.synchronization.mutex_types.timed_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex.nativehandle" title="Member function native_handle()">Member 6545 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a> 6546</h5></div></div></div> 6547<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> 6548<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 6549</pre> 6550<div class="variablelist"> 6551<p class="title"><b></b></p> 6552<dl class="variablelist"> 6553<dt><span class="term">Effects:</span></dt> 6554<dd><p> 6555 Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code> 6556 that can be used with platform-specific APIs to manipulate the 6557 underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code> 6558 and <code class="computeroutput"><span class="identifier">native_handle_type</span></code> 6559 are not present. 6560 </p></dd> 6561<dt><span class="term">Throws:</span></dt> 6562<dd><p> 6563 Nothing. 6564 </p></dd> 6565</dl> 6566</div> 6567</div> 6568</div> 6569<div class="section"> 6570<div class="titlepage"><div><div><h4 class="title"> 6571<a name="thread.synchronization.mutex_types.recursive_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex">Class 6572 <code class="computeroutput"><span class="identifier">recursive_mutex</span></code></a> 6573</h4></div></div></div> 6574<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex.nativehandle">Member 6575 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div> 6576<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">recursive_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6577 6578<span class="keyword">class</span> <span class="identifier">recursive_mutex</span><span class="special">:</span> 6579 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span> 6580<span class="special">{</span> 6581<span class="keyword">public</span><span class="special">:</span> 6582 <span class="identifier">recursive_mutex</span><span class="special">();</span> 6583 <span class="special">~</span><span class="identifier">recursive_mutex</span><span class="special">();</span> 6584 6585 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 6586 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 6587 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 6588 6589 <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> 6590 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 6591 6592 <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">recursive_mutex</span><span class="special">></span> <span class="identifier">scoped_lock</span><span class="special">;</span> 6593 <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span> 6594<span class="special">};</span> 6595</pre> 6596<p> 6597 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> implements the 6598 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to provide an 6599 exclusive-ownership recursive mutex. At most one thread can own the lock 6600 on a given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> at any time. Multiple 6601 concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>, 6602 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6603 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 6604 shall be permitted. A thread that already has exclusive ownership of a 6605 given <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> instance can call 6606 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a> 6607 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6608 to acquire an additional level of ownership of the mutex. <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 6609 must be called once for each level of ownership acquired by a single thread 6610 before ownership can be acquired by another thread. 6611 </p> 6612<div class="section"> 6613<div class="titlepage"><div><div><h5 class="title"> 6614<a name="thread.synchronization.mutex_types.recursive_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex.nativehandle" title="Member function native_handle()">Member 6615 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a> 6616</h5></div></div></div> 6617<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> 6618<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 6619</pre> 6620<div class="variablelist"> 6621<p class="title"><b></b></p> 6622<dl class="variablelist"> 6623<dt><span class="term">Effects:</span></dt> 6624<dd><p> 6625 Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code> 6626 that can be used with platform-specific APIs to manipulate the 6627 underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code> 6628 and <code class="computeroutput"><span class="identifier">native_handle_type</span></code> 6629 are not present. 6630 </p></dd> 6631<dt><span class="term">Throws:</span></dt> 6632<dd><p> 6633 Nothing. 6634 </p></dd> 6635</dl> 6636</div> 6637</div> 6638</div> 6639<div class="section"> 6640<div class="titlepage"><div><div><h4 class="title"> 6641<a name="thread.synchronization.mutex_types.recursive_try_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex" title="Typedef recursive_try_mutex">Typedef 6642 <code class="computeroutput"><span class="identifier">recursive_try_mutex</span></code></a> 6643</h4></div></div></div> 6644<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">recursive_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6645 6646<span class="keyword">typedef</span> <span class="identifier">recursive_mutex</span> <span class="identifier">recursive_try_mutex</span><span class="special">;</span> 6647</pre> 6648<p> 6649 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex" title="Typedef recursive_try_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_try_mutex</span></code></a> is a <code class="computeroutput"><span class="keyword">typedef</span></code> to <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a>, provided for 6650 backwards compatibility with previous releases of boost. 6651 </p> 6652</div> 6653<div class="section"> 6654<div class="titlepage"><div><div><h4 class="title"> 6655<a name="thread.synchronization.mutex_types.recursive_timed_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex">Class 6656 <code class="computeroutput"><span class="identifier">recursive_timed_mutex</span></code></a> 6657</h4></div></div></div> 6658<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle">Member 6659 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div> 6660<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">recursive_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6661 6662<span class="keyword">class</span> <span class="identifier">recursive_timed_mutex</span><span class="special">:</span> 6663 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span> 6664<span class="special">{</span> 6665<span class="keyword">public</span><span class="special">:</span> 6666 <span class="identifier">recursive_timed_mutex</span><span class="special">();</span> 6667 <span class="special">~</span><span class="identifier">recursive_timed_mutex</span><span class="special">();</span> 6668 6669 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 6670 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 6671 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 6672 6673 6674 <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> 6675 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6676 <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> 6677 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6678 6679 <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> 6680 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 6681 6682 <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">recursive_timed_mutex</span><span class="special">></span> <span class="identifier">scoped_lock</span><span class="special">;</span> 6683 <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span> 6684 <span class="keyword">typedef</span> <span class="identifier">scoped_lock</span> <span class="identifier">scoped_timed_lock</span><span class="special">;</span> 6685 6686<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span> 6687 <span class="keyword">bool</span> <span class="identifier">timed_lock</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> 6688 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">></span> 6689 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">relative_time</span><span class="special">);</span> 6690<span class="preprocessor">#endif</span> 6691 6692<span class="special">};</span> 6693</pre> 6694<p> 6695 <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> implements 6696 the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> to provide 6697 an exclusive-ownership recursive mutex. At most one thread can own the 6698 lock on a given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> at any time. 6699 Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>, 6700 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>, 6701 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>, 6702 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a> 6703 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 6704 shall be permitted. A thread that already has exclusive ownership of a 6705 given <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> instance 6706 can call <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>, 6707 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>, 6708 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a> 6709 or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a> 6710 to acquire an additional level of ownership of the mutex. <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a> 6711 must be called once for each level of ownership acquired by a single thread 6712 before ownership can be acquired by another thread. 6713 </p> 6714<div class="section"> 6715<div class="titlepage"><div><div><h5 class="title"> 6716<a name="thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle" title="Member function native_handle()">Member 6717 function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a> 6718</h5></div></div></div> 6719<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> 6720<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span> 6721</pre> 6722<div class="variablelist"> 6723<p class="title"><b></b></p> 6724<dl class="variablelist"> 6725<dt><span class="term">Effects:</span></dt> 6726<dd><p> 6727 Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code> 6728 that can be used with platform-specific APIs to manipulate the 6729 underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code> 6730 and <code class="computeroutput"><span class="identifier">native_handle_type</span></code> 6731 are not present. 6732 </p></dd> 6733<dt><span class="term">Throws:</span></dt> 6734<dd><p> 6735 Nothing. 6736 </p></dd> 6737</dl> 6738</div> 6739</div> 6740</div> 6741<div class="section"> 6742<div class="titlepage"><div><div><h4 class="title"> 6743<a name="thread.synchronization.mutex_types.shared_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.shared_mutex" title="Class shared_mutex -- C++14">Class 6744 <code class="computeroutput"><span class="identifier">shared_mutex</span></code> -- C++14</a> 6745</h4></div></div></div> 6746<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">shared_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6747 6748<span class="keyword">class</span> <span class="identifier">shared_mutex</span> 6749<span class="special">{</span> 6750<span class="keyword">public</span><span class="special">:</span> 6751 <span class="identifier">shared_mutex</span><span class="special">(</span><span class="identifier">shared_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 6752 <span class="identifier">shared_mutex</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 6753 6754 <span class="identifier">shared_mutex</span><span class="special">();</span> 6755 <span class="special">~</span><span class="identifier">shared_mutex</span><span class="special">();</span> 6756 6757 <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span> 6758 <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span> 6759 <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> 6760 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_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> 6761 <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> 6762 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_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> 6763 <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span> 6764 6765 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 6766 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 6767 <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> 6768 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6769 <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> 6770 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6771 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 6772 6773<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span> 6774 <span class="comment">// use upgrade_mutex instead.</span> 6775 <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 6776 <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 6777 6778 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 6779 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 6780 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 6781 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 6782<span class="preprocessor">#endif</span> 6783 6784<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span> 6785 <span class="keyword">bool</span> <span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">timeout</span><span class="special">);</span> <span class="comment">// DEPRECATED</span> 6786 <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">timeout</span><span class="special">);</span> <span class="comment">// DEPRECATED</span> 6787<span class="preprocessor">#endif</span> 6788 6789<span class="special">};</span> 6790</pre> 6791<p> 6792 The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_mutex</span></code> provides an implementation 6793 of a multiple-reader / single-writer mutex. It implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a>. 6794 </p> 6795<p> 6796 Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>, 6797 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>, 6798 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">()</span></code>, 6799 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">()</span></code>, 6800 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>, 6801 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>, 6802 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">()</span></code>, 6803 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">()</span></code>, 6804 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a> 6805 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a> 6806 are permitted. 6807 </p> 6808<p> 6809 Note the the lack of reader-writer priority policies in shared_mutex. This 6810 is due to an algorithm credited to Alexander Terekhov which lets the OS 6811 decide which thread is the next to get the lock without caring whether 6812 a unique lock or shared lock is being sought. This results in a complete 6813 lack of reader or writer starvation. It is simply fair. 6814 </p> 6815</div> 6816<div class="section"> 6817<div class="titlepage"><div><div><h4 class="title"> 6818<a name="thread.synchronization.mutex_types.upgrade_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.upgrade_mutex" title="Class upgrade_mutex -- EXTENSION">Class 6819 <code class="computeroutput"><span class="identifier">upgrade_mutex</span></code> -- EXTENSION</a> 6820</h4></div></div></div> 6821<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">shared_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6822 6823<span class="keyword">class</span> <span class="identifier">upgrade_mutex</span> 6824<span class="special">{</span> 6825<span class="keyword">public</span><span class="special">:</span> 6826 <span class="identifier">upgrade_mutex</span><span class="special">(</span><span class="identifier">upgrade_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 6827 <span class="identifier">upgrade_mutex</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 6828 6829 <span class="identifier">upgrade_mutex</span><span class="special">();</span> 6830 <span class="special">~</span><span class="identifier">upgrade_mutex</span><span class="special">();</span> 6831 6832 <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span> 6833 <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span> 6834 <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> 6835 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_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> 6836 <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> 6837 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_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> 6838 <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span> 6839 6840 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 6841 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 6842 <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> 6843 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6844 <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> 6845 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6846 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 6847 6848 <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span> 6849 <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> 6850 <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_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> 6851 <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> 6852 <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_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> 6853 <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span> 6854 6855 <span class="comment">// Shared <-> Exclusive</span> 6856 6857<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span> 6858 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock</span><span class="special">();</span> 6859 <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> 6860 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_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> 6861 <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> 6862 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_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> 6863<span class="preprocessor">#endif</span> 6864 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span> 6865 6866 <span class="comment">// Shared <-> Upgrade</span> 6867 6868<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span> 6869 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">();</span> 6870 <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> 6871 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_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> 6872 <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> 6873 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_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> 6874<span class="preprocessor">#endif</span> 6875 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span> 6876 6877 <span class="comment">// Upgrade <-> Exclusive</span> 6878 6879 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span> 6880<span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PLATFORM_PTHREAD</span><span class="special">)</span> 6881 <span class="special">||</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span><span class="special">)</span> 6882 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">();</span> 6883 <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> 6884 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_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> 6885 <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> 6886 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_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> 6887<span class="preprocessor">#endif</span> 6888 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span> 6889<span class="special">};</span> 6890</pre> 6891<p> 6892 The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_mutex</span></code> provides an implementation 6893 of a multiple-reader / single-writer mutex. It implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a>. 6894 </p> 6895<p> 6896 Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>, 6897 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>, 6898 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">()</span></code>, 6899 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">()</span></code>, 6900 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>, 6901 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>, 6902 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">()</span></code>, 6903 <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">()</span></code>, 6904 <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a> 6905 and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a> 6906 are permitted. 6907 </p> 6908</div> 6909<div class="section"> 6910<div class="titlepage"><div><div><h4 class="title"> 6911<a name="thread.synchronization.mutex_types.null_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.null_mutex" title="Class null_mutex -- EXTENSION">Class 6912 <code class="computeroutput"><span class="identifier">null_mutex</span></code> -- EXTENSION</a> 6913</h4></div></div></div> 6914<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">null_mutex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6915 6916<span class="keyword">class</span> <span class="identifier">null_mutex</span> 6917<span class="special">{</span> 6918<span class="keyword">public</span><span class="special">:</span> 6919 <span class="identifier">null_mutex</span><span class="special">(</span><span class="identifier">null_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 6920 <span class="identifier">null_mutex</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">null_mutex</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 6921 6922 <span class="identifier">null_mutex</span><span class="special">();</span> 6923 <span class="special">~</span><span class="identifier">null_mutex</span><span class="special">();</span> 6924 6925 <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span> 6926 <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span> 6927 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span> 6928 <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> 6929 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_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> 6930 <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> 6931 <span class="keyword">bool</span> <span class="identifier">try_lock_shared_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> 6932 <span class="preprocessor">#endif</span> 6933 <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span> 6934 6935 <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span> 6936 <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span> 6937 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span> 6938 <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> 6939 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6940 <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> 6941 <span class="keyword">bool</span> <span class="identifier">try_lock_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> 6942 <span class="preprocessor">#endif</span> 6943 <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span> 6944 6945 <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span> 6946 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span> 6947 <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> 6948 <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_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> 6949 <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> 6950 <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_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> 6951 <span class="preprocessor">#endif</span> 6952 <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span> 6953 6954 <span class="comment">// Shared <-> Exclusive</span> 6955 6956 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock</span><span class="special">();</span> 6957 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span> 6958 <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> 6959 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_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> 6960 <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> 6961 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_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> 6962 <span class="preprocessor">#endif</span> 6963 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span> 6964 6965 <span class="comment">// Shared <-> Upgrade</span> 6966 6967 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">();</span> 6968 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span> 6969 <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> 6970 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_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> 6971 <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> 6972 <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_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> 6973 <span class="preprocessor">#endif</span> 6974 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span> 6975 6976 <span class="comment">// Upgrade <-> Exclusive</span> 6977 6978 <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span> 6979 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">();</span> 6980 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span> 6981 <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> 6982 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_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> 6983 <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> 6984 <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_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> 6985 <span class="preprocessor">#endif</span> 6986 <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span> 6987<span class="special">};</span> 6988</pre> 6989<p> 6990 The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">null_mutex</span></code> provides a no-op implementation 6991 of a multiple-reader / single-writer mutex. It is a model of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> concept. 6992 </p> 6993</div> 6994</div> 6995<div class="section"> 6996<div class="titlepage"><div><div><h3 class="title"> 6997<a name="thread.synchronization.condvar_ref"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref" title="Condition Variables">Condition Variables</a> 6998</h3></div></div></div> 6999<div class="toc"><dl class="toc"> 7000<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable">Class 7001 <code class="computeroutput"><span class="identifier">condition_variable</span></code></a></span></dt> 7002<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any">Class 7003 <code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a></span></dt> 7004<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition">Typedef 7005 <code class="computeroutput"><span class="identifier">condition</span></code> DEPRECATED V3</a></span></dt> 7006<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.notify_all_at_thread_exit">Non-member 7007 Function <code class="computeroutput"><span class="identifier">notify_all_at_thread_exit</span></code>()</a></span></dt> 7008</dl></div> 7009<h5> 7010<a name="thread.synchronization.condvar_ref.h0"></a> 7011 <span class="phrase"><a name="thread.synchronization.condvar_ref.synopsis"></a></span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.synopsis">Synopsis</a> 7012 </h5> 7013<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> 7014<span class="special">{</span> 7015 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">cv_status</span><span class="special">;</span> 7016 <span class="special">{</span> 7017 <span class="identifier">no_timeout</span><span class="special">,</span> 7018 <span class="identifier">timeout</span> 7019 <span class="special">};</span> 7020 <span class="keyword">class</span> <span class="identifier">condition_variable</span><span class="special">;</span> 7021 <span class="keyword">class</span> <span class="identifier">condition_variable_any</span><span class="special">;</span> 7022 <span class="keyword">void</span> <span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">condition_variable</span><span class="special">&</span> <span class="identifier">cond</span><span class="special">,</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">);</span> 7023<span class="special">}</span> 7024</pre> 7025<p> 7026 The classes <code class="computeroutput"><span class="identifier">condition_variable</span></code> 7027 and <code class="computeroutput"><span class="identifier">condition_variable_any</span></code> 7028 provide a mechanism for one thread to wait for notification from another 7029 thread that a particular condition has become true. The general usage pattern 7030 is that one thread locks a mutex and then calls <code class="computeroutput"><span class="identifier">wait</span></code> 7031 on an instance of <code class="computeroutput"><span class="identifier">condition_variable</span></code> 7032 or <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>. 7033 When the thread is woken from the wait, then it checks to see if the appropriate 7034 condition is now true, and continues if so. If the condition is not true, 7035 then the thread then calls <code class="computeroutput"><span class="identifier">wait</span></code> 7036 again to resume waiting. In the simplest case, this condition is just a boolean 7037 variable: 7038 </p> 7039<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span> <span class="identifier">cond</span><span class="special">;</span> 7040<span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mut</span><span class="special">;</span> 7041<span class="keyword">bool</span> <span class="identifier">data_ready</span><span class="special">;</span> 7042 7043<span class="keyword">void</span> <span class="identifier">process_data</span><span class="special">();</span> 7044 7045<span class="keyword">void</span> <span class="identifier">wait_for_data_to_process</span><span class="special">()</span> 7046<span class="special">{</span> 7047 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">mut</span><span class="special">);</span> 7048 <span class="keyword">while</span><span class="special">(!</span><span class="identifier">data_ready</span><span class="special">)</span> 7049 <span class="special">{</span> 7050 <span class="identifier">cond</span><span class="special">.</span><span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span> 7051 <span class="special">}</span> 7052 <span class="identifier">process_data</span><span class="special">();</span> 7053<span class="special">}</span> 7054</pre> 7055<p> 7056 Notice that the <code class="computeroutput"><span class="identifier">lock</span></code> is passed 7057 to <code class="computeroutput"><span class="identifier">wait</span></code>: <code class="computeroutput"><span class="identifier">wait</span></code> 7058 will atomically add the thread to the set of threads waiting on the condition 7059 variable, and unlock the mutex. When the thread is woken, the mutex will 7060 be locked again before the call to <code class="computeroutput"><span class="identifier">wait</span></code> 7061 returns. This allows other threads to acquire the mutex in order to update 7062 the shared data, and ensures that the data associated with the condition 7063 is correctly synchronized. 7064 </p> 7065<p> 7066 In the mean time, another thread sets the condition to <code class="computeroutput"><span class="keyword">true</span></code>, 7067 and then calls either <code class="computeroutput"><span class="identifier">notify_one</span></code> 7068 or <code class="computeroutput"><span class="identifier">notify_all</span></code> on the condition 7069 variable to wake one waiting thread or all the waiting threads respectively. 7070 </p> 7071<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">retrieve_data</span><span class="special">();</span> 7072<span class="keyword">void</span> <span class="identifier">prepare_data</span><span class="special">();</span> 7073 7074<span class="keyword">void</span> <span class="identifier">prepare_data_for_processing</span><span class="special">()</span> 7075<span class="special">{</span> 7076 <span class="identifier">retrieve_data</span><span class="special">();</span> 7077 <span class="identifier">prepare_data</span><span class="special">();</span> 7078 <span class="special">{</span> 7079 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">mut</span><span class="special">);</span> 7080 <span class="identifier">data_ready</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span> 7081 <span class="special">}</span> 7082 <span class="identifier">cond</span><span class="special">.</span><span class="identifier">notify_one</span><span class="special">();</span> 7083<span class="special">}</span> 7084</pre> 7085<p> 7086 Note that the same mutex is locked before the shared data is updated, but 7087 that the mutex does not have to be locked across the call to <code class="computeroutput"><span class="identifier">notify_one</span></code>. 7088 </p> 7089<p> 7090 This example uses an object of type <code class="computeroutput"><span class="identifier">condition_variable</span></code>, 7091 but would work just as well with an object of type <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>: 7092 <code class="computeroutput"><span class="identifier">condition_variable_any</span></code> is 7093 more general, and will work with any kind of lock or mutex, whereas <code class="computeroutput"><span class="identifier">condition_variable</span></code> requires that the lock 7094 passed to <code class="computeroutput"><span class="identifier">wait</span></code> is an instance 7095 of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span></code>. 7096 This enables <code class="computeroutput"><span class="identifier">condition_variable</span></code> 7097 to make optimizations in some cases, based on the knowledge of the mutex 7098 type; <code class="computeroutput"><span class="identifier">condition_variable_any</span></code> 7099 typically has a more complex implementation than <code class="computeroutput"><span class="identifier">condition_variable</span></code>. 7100 </p> 7101<div class="section"> 7102<div class="titlepage"><div><div><h4 class="title"> 7103<a name="thread.synchronization.condvar_ref.condition_variable"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable" title="Class condition_variable">Class 7104 <code class="computeroutput"><span class="identifier">condition_variable</span></code></a> 7105</h4></div></div></div> 7106<div class="toc"><dl class="toc"> 7107<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.constructor"><code class="computeroutput"><span class="identifier">condition_variable</span><span class="special">()</span></code></a></span></dt> 7108<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable</span><span class="special">()</span></code></a></span></dt> 7109<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_one"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a></span></dt> 7110<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_all"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a></span></dt> 7111<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">)</span></code></a></span></dt> 7112<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7113 <span class="identifier">lock</span><span class="special">,</span> 7114 <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt> 7115<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> 7116 <span class="keyword">const</span><span class="special">&</span> 7117 <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 7118<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_rel"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7119 <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 7120<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7121 <span class="identifier">lock</span><span class="special">,</span> 7122 <span class="identifier">boost</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="identifier">predicate_type</span> 7123 <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt> 7124<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until"><code class="computeroutput"><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> 7125 <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</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> 7126 <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt> 7127<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for"><code class="computeroutput"><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> 7128 <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</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> 7129 <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 7130<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until_predicate"><code class="computeroutput"><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">class</span> <span class="identifier">Predicate</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7131 <span class="identifier">lock</span><span class="special">,</span> 7132 <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="identifier">Predicate</span> 7133 <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt> 7134<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for_predicate"><code class="computeroutput"><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">class</span> <span class="identifier">Predicate</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7135 <span class="identifier">lock</span><span class="special">,</span> 7136 <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="identifier">Predicate</span> 7137 <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt> 7138</dl></div> 7139<pre class="programlisting"><span class="comment">//#include <boost/thread/condition_variable.hpp></span> 7140 7141<span class="keyword">namespace</span> <span class="identifier">boost</span> 7142<span class="special">{</span> 7143 <span class="keyword">class</span> <span class="identifier">condition_variable</span> 7144 <span class="special">{</span> 7145 <span class="keyword">public</span><span class="special">:</span> 7146 <span class="identifier">condition_variable</span><span class="special">();</span> 7147 <span class="special">~</span><span class="identifier">condition_variable</span><span class="special">();</span> 7148 7149 <span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 7150 <span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 7151 7152 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">);</span> 7153 7154 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7155 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span> 7156 7157 <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> 7158 <span class="keyword">typename</span> <span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">type</span> 7159 <span class="identifier">wait_until</span><span class="special">(</span> 7160 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span> 7161 <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> 7162 7163 <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">class</span> <span class="identifier">Predicate</span><span class="special">></span> 7164 <span class="keyword">bool</span> 7165 <span class="identifier">wait_until</span><span class="special">(</span> 7166 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span> 7167 <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> 7168 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span> 7169 7170 <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> 7171 <span class="keyword">typename</span> <span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">type</span> 7172 <span class="identifier">wait_for</span><span class="special">(</span> 7173 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span> 7174 <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">d</span><span class="special">);</span> 7175 7176 <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">class</span> <span class="identifier">Predicate</span><span class="special">></span> 7177 <span class="keyword">bool</span> 7178 <span class="identifier">wait_for</span><span class="special">(</span> 7179 <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span> 7180 <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">d</span><span class="special">,</span> 7181 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span> 7182 7183 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span> 7184 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</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> 7185 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span> 7186 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span> 7187 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7188 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</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="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span> 7189 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7190 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span> 7191 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span> 7192 7193 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7194 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span> 7195 <span class="preprocessor">#endif</span> 7196 7197 <span class="special">};</span> 7198<span class="special">}</span> 7199</pre> 7200<div class="section"> 7201<div class="titlepage"><div><div><h5 class="title"> 7202<a name="thread.synchronization.condvar_ref.condition_variable.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.constructor" title="condition_variable()"><code class="computeroutput"><span class="identifier">condition_variable</span><span class="special">()</span></code></a> 7203</h5></div></div></div> 7204<div class="variablelist"> 7205<p class="title"><b></b></p> 7206<dl class="variablelist"> 7207<dt><span class="term">Effects:</span></dt> 7208<dd><p> 7209 Constructs an object of class <code class="computeroutput"><span class="identifier">condition_variable</span></code>. 7210 </p></dd> 7211<dt><span class="term">Throws:</span></dt> 7212<dd><p> 7213 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7214 occurs. 7215 </p></dd> 7216</dl> 7217</div> 7218</div> 7219<div class="section"> 7220<div class="titlepage"><div><div><h5 class="title"> 7221<a name="thread.synchronization.condvar_ref.condition_variable.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.destructor" title="~condition_variable()"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable</span><span class="special">()</span></code></a> 7222</h5></div></div></div> 7223<div class="variablelist"> 7224<p class="title"><b></b></p> 7225<dl class="variablelist"> 7226<dt><span class="term">Precondition:</span></dt> 7227<dd><p> 7228 All threads waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> have been notified by a call 7229 to <code class="computeroutput"><span class="identifier">notify_one</span></code> or 7230 <code class="computeroutput"><span class="identifier">notify_all</span></code> (though 7231 the respective calls to <code class="computeroutput"><span class="identifier">wait</span></code> 7232 or <code class="computeroutput"><span class="identifier">timed_wait</span></code> need 7233 not have returned). 7234 </p></dd> 7235<dt><span class="term">Effects:</span></dt> 7236<dd><p> 7237 Destroys the object. 7238 </p></dd> 7239<dt><span class="term">Throws:</span></dt> 7240<dd><p> 7241 Nothing. 7242 </p></dd> 7243</dl> 7244</div> 7245</div> 7246<div class="section"> 7247<div class="titlepage"><div><div><h5 class="title"> 7248<a name="thread.synchronization.condvar_ref.condition_variable.notify_one"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_one" title="void notify_one()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a> 7249</h5></div></div></div> 7250<div class="variablelist"> 7251<p class="title"><b></b></p> 7252<dl class="variablelist"> 7253<dt><span class="term">Effects:</span></dt> 7254<dd><p> 7255 If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting 7256 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 7257 in a call to <code class="computeroutput"><span class="identifier">wait</span></code> 7258 or <code class="computeroutput"><span class="identifier">timed_wait</span></code>, 7259 unblocks one of those threads. 7260 </p></dd> 7261<dt><span class="term">Throws:</span></dt> 7262<dd><p> 7263 Nothing. 7264 </p></dd> 7265</dl> 7266</div> 7267</div> 7268<div class="section"> 7269<div class="titlepage"><div><div><h5 class="title"> 7270<a name="thread.synchronization.condvar_ref.condition_variable.notify_all"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_all" title="void notify_all()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a> 7271</h5></div></div></div> 7272<div class="variablelist"> 7273<p class="title"><b></b></p> 7274<dl class="variablelist"> 7275<dt><span class="term">Effects:</span></dt> 7276<dd><p> 7277 If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting 7278 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 7279 in a call to <code class="computeroutput"><span class="identifier">wait</span></code> 7280 or <code class="computeroutput"><span class="identifier">timed_wait</span></code>, 7281 unblocks all of those threads. 7282 </p></dd> 7283<dt><span class="term">Throws:</span></dt> 7284<dd><p> 7285 Nothing. 7286 </p></dd> 7287</dl> 7288</div> 7289</div> 7290<div class="section"> 7291<div class="titlepage"><div><div><h5 class="title"> 7292<a name="thread.synchronization.condvar_ref.condition_variable.wait"></a><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="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">)</span></code></a> 7293</h5></div></div></div> 7294<div class="variablelist"> 7295<p class="title"><b></b></p> 7296<dl class="variablelist"> 7297<dt><span class="term">Precondition:</span></dt> 7298<dd><p> 7299 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7300 by the current thread, and either no other thread is currently 7301 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 7302 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the 7303 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or 7304 <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all 7305 the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value 7306 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code> 7307 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>. 7308 </p></dd> 7309<dt><span class="term">Effects:</span></dt> 7310<dd><p> 7311 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 7312 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 7313 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 7314 or spuriously. When the thread is unblocked (for whatever reason), 7315 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also 7316 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an 7317 exception. 7318 </p></dd> 7319<dt><span class="term">Postcondition:</span></dt> 7320<dd><p> 7321 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7322 by the current thread. 7323 </p></dd> 7324<dt><span class="term">Throws:</span></dt> 7325<dd><p> 7326 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7327 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 7328 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 7329 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 associated 7330 with the current thread of execution. 7331 </p></dd> 7332</dl> 7333</div> 7334</div> 7335<div class="section"> 7336<div class="titlepage"><div><div><h5 class="title"> 7337<a name="thread.synchronization.condvar_ref.condition_variable.wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_predicate" title="template<typename predicate_type> void wait(boost::unique_lock<boost::mutex>& lock, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7338 <span class="identifier">lock</span><span class="special">,</span> 7339 <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a> 7340</h5></div></div></div> 7341<div class="variablelist"> 7342<p class="title"><b></b></p> 7343<dl class="variablelist"> 7344<dt><span class="term">Effects:</span></dt> 7345<dd> 7346<p> 7347 As-if 7348</p> 7349<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span> 7350<span class="special">{</span> 7351 <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span> 7352<span class="special">}</span> 7353</pre> 7354<p> 7355 </p> 7356</dd> 7357</dl> 7358</div> 7359</div> 7360<div class="section"> 7361<div class="titlepage"><div><div><h5 class="title"> 7362<a name="thread.synchronization.condvar_ref.condition_variable.timed_wait"></a><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="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> 7363 <span class="keyword">const</span><span class="special">&</span> 7364 <span class="identifier">abs_time</span><span class="special">)</span></code></a> 7365</h5></div></div></div> 7366<div class="variablelist"> 7367<p class="title"><b></b></p> 7368<dl class="variablelist"> 7369<dt><span class="term">Precondition:</span></dt> 7370<dd><p> 7371 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7372 by the current thread, and either no other thread is currently 7373 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 7374 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the 7375 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or 7376 <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all 7377 the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value 7378 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code> 7379 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>. 7380 </p></dd> 7381<dt><span class="term">Effects:</span></dt> 7382<dd><p> 7383 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 7384 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 7385 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 7386 when the time as reported by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()</span></code> would be equal to or later than 7387 the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>, 7388 or spuriously. When the thread is unblocked (for whatever reason), 7389 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also 7390 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an 7391 exception. 7392 </p></dd> 7393<dt><span class="term">Returns:</span></dt> 7394<dd><p> 7395 <code class="computeroutput"><span class="keyword">false</span></code> if the call 7396 is returning because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 7397 was reached, <code class="computeroutput"><span class="keyword">true</span></code> 7398 otherwise. 7399 </p></dd> 7400<dt><span class="term">Postcondition:</span></dt> 7401<dd><p> 7402 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7403 by the current thread. 7404 </p></dd> 7405<dt><span class="term">Throws:</span></dt> 7406<dd><p> 7407 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7408 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 7409 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 7410 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 associated 7411 with the current thread of execution. 7412 </p></dd> 7413</dl> 7414</div> 7415</div> 7416<div class="section"> 7417<div class="titlepage"><div><div><h5 class="title"> 7418<a name="thread.synchronization.condvar_ref.condition_variable.timed_wait_rel"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_rel" title="template<typename duration_type> bool timed_wait(boost::unique_lock<boost::mutex>& lock,duration_type const& rel_time)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7419 <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a> 7420</h5></div></div></div> 7421<div class="variablelist"> 7422<p class="title"><b></b></p> 7423<dl class="variablelist"> 7424<dt><span class="term">Precondition:</span></dt> 7425<dd><p> 7426 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7427 by the current thread, and either no other thread is currently 7428 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 7429 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the 7430 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or 7431 <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all 7432 the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value 7433 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code> 7434 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>. 7435 </p></dd> 7436<dt><span class="term">Effects:</span></dt> 7437<dd><p> 7438 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 7439 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 7440 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 7441 after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code> 7442 argument has elapsed, or spuriously. When the thread is unblocked 7443 (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> 7444 before the call to <code class="computeroutput"><span class="identifier">wait</span></code> 7445 returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> 7446 if the function exits with an exception. 7447 </p></dd> 7448<dt><span class="term">Returns:</span></dt> 7449<dd><p> 7450 <code class="computeroutput"><span class="keyword">false</span></code> if the call 7451 is returning because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> has elapsed, <code class="computeroutput"><span class="keyword">true</span></code> otherwise. 7452 </p></dd> 7453<dt><span class="term">Postcondition:</span></dt> 7454<dd><p> 7455 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7456 by the current thread. 7457 </p></dd> 7458<dt><span class="term">Throws:</span></dt> 7459<dd><p> 7460 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7461 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 7462 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 7463 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 associated 7464 with the current thread of execution. 7465 </p></dd> 7466</dl> 7467</div> 7468<div class="note"><table border="0" summary="Note"> 7469<tr> 7470<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 7471<th align="left">Note</th> 7472</tr> 7473<tr><td align="left" valign="top"><p> 7474 The duration overload of timed_wait is difficult to use correctly. 7475 The overload taking a predicate should be preferred in most cases. 7476 </p></td></tr> 7477</table></div> 7478</div> 7479<div class="section"> 7480<div class="titlepage"><div><div><h5 class="title"> 7481<a name="thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate" title="template<typename predicate_type> bool timed_wait(boost::unique_lock<boost::mutex>& lock, boost::system_time const& abs_time, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7482 <span class="identifier">lock</span><span class="special">,</span> 7483 <span class="identifier">boost</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="identifier">predicate_type</span> 7484 <span class="identifier">pred</span><span class="special">)</span></code></a> 7485</h5></div></div></div> 7486<div class="variablelist"> 7487<p class="title"><b></b></p> 7488<dl class="variablelist"> 7489<dt><span class="term">Effects:</span></dt> 7490<dd> 7491<p> 7492 As-if 7493</p> 7494<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span> 7495<span class="special">{</span> 7496 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span> 7497 <span class="special">{</span> 7498 <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span> 7499 <span class="special">}</span> 7500<span class="special">}</span> 7501<span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 7502</pre> 7503<p> 7504 </p> 7505</dd> 7506</dl> 7507</div> 7508</div> 7509<div class="section"> 7510<div class="titlepage"><div><div><h5 class="title"> 7511<a name="thread.synchronization.condvar_ref.condition_variable.wait_until"></a><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="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> 7512 <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</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> 7513 <span class="identifier">abs_time</span><span class="special">)</span></code></a> 7514</h5></div></div></div> 7515<div class="variablelist"> 7516<p class="title"><b></b></p> 7517<dl class="variablelist"> 7518<dt><span class="term">Precondition:</span></dt> 7519<dd><p> 7520 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7521 by the current thread, and either no other thread is currently 7522 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 7523 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the 7524 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or 7525 <code class="computeroutput"><span class="identifier">wait_for</span></code> or <code class="computeroutput"><span class="identifier">wait_until</span></code> in all the threads 7526 currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value 7527 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code> 7528 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>. 7529 </p></dd> 7530<dt><span class="term">Effects:</span></dt> 7531<dd><p> 7532 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 7533 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 7534 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 7535 when the time as reported by <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code> would be equal to or later than 7536 the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>, 7537 or spuriously. When the thread is unblocked (for whatever reason), 7538 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also 7539 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an 7540 exception. 7541 </p></dd> 7542<dt><span class="term">Returns:</span></dt> 7543<dd><p> 7544 <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning 7545 because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 7546 was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code> 7547 otherwise. 7548 </p></dd> 7549<dt><span class="term">Postcondition:</span></dt> 7550<dd><p> 7551 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7552 by the current thread. 7553 </p></dd> 7554<dt><span class="term">Throws:</span></dt> 7555<dd><p> 7556 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7557 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 7558 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 7559 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 associated 7560 with the current thread of execution. 7561 </p></dd> 7562</dl> 7563</div> 7564</div> 7565<div class="section"> 7566<div class="titlepage"><div><div><h5 class="title"> 7567<a name="thread.synchronization.condvar_ref.condition_variable.wait_for"></a><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="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> 7568 <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> <span class="identifier">lock</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> 7569 <span class="identifier">rel_time</span><span class="special">)</span></code></a> 7570</h5></div></div></div> 7571<div class="variablelist"> 7572<p class="title"><b></b></p> 7573<dl class="variablelist"> 7574<dt><span class="term">Precondition:</span></dt> 7575<dd><p> 7576 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7577 by the current thread, and either no other thread is currently 7578 waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 7579 or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the 7580 calls to <code class="computeroutput"><span class="identifier">wait</span></code> or 7581 <code class="computeroutput"><span class="identifier">wait_until</span></code> or 7582 <code class="computeroutput"><span class="identifier">wait_for</span></code> in all 7583 the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value 7584 as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-></span><span class="identifier">mutex</span><span class="special">()</span></code> 7585 for this call to <code class="computeroutput"><span class="identifier">wait</span></code>. 7586 </p></dd> 7587<dt><span class="term">Effects:</span></dt> 7588<dd><p> 7589 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 7590 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 7591 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 7592 after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code> 7593 argument has elapsed, or spuriously. When the thread is unblocked 7594 (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> 7595 before the call to <code class="computeroutput"><span class="identifier">wait</span></code> 7596 returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> 7597 if the function exits with an exception. 7598 </p></dd> 7599<dt><span class="term">Returns:</span></dt> 7600<dd><p> 7601 <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span> </code> if the call is returning 7602 because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> 7603 has elapsed, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span> 7604 </code> otherwise. 7605 </p></dd> 7606<dt><span class="term">Postcondition:</span></dt> 7607<dd><p> 7608 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7609 by the current thread. 7610 </p></dd> 7611<dt><span class="term">Throws:</span></dt> 7612<dd><p> 7613 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7614 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 7615 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 7616 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 associated 7617 with the current thread of execution. 7618 </p></dd> 7619</dl> 7620</div> 7621<div class="note"><table border="0" summary="Note"> 7622<tr> 7623<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 7624<th align="left">Note</th> 7625</tr> 7626<tr><td align="left" valign="top"><p> 7627 The duration overload of timed_wait is difficult to use correctly. 7628 The overload taking a predicate should be preferred in most cases. 7629 </p></td></tr> 7630</table></div> 7631</div> 7632<div class="section"> 7633<div class="titlepage"><div><div><h5 class="title"> 7634<a name="thread.synchronization.condvar_ref.condition_variable.wait_until_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until_predicate" title="template <class Clock, class Duration, class Predicate> bool wait_until(boost::unique_lock<boost::mutex>& lock, const chrono::time_point<Clock, Duration>& abs_time, Predicate pred)"><code class="computeroutput"><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">class</span> <span class="identifier">Predicate</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7635 <span class="identifier">lock</span><span class="special">,</span> 7636 <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="identifier">Predicate</span> 7637 <span class="identifier">pred</span><span class="special">)</span></code></a> 7638</h5></div></div></div> 7639<div class="variablelist"> 7640<p class="title"><b></b></p> 7641<dl class="variablelist"> 7642<dt><span class="term">Effects:</span></dt> 7643<dd> 7644<p> 7645 As-if 7646</p> 7647<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span> 7648<span class="special">{</span> 7649 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span> 7650 <span class="special">{</span> 7651 <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span> 7652 <span class="special">}</span> 7653<span class="special">}</span> 7654<span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 7655</pre> 7656<p> 7657 </p> 7658</dd> 7659</dl> 7660</div> 7661</div> 7662<div class="section"> 7663<div class="titlepage"><div><div><h5 class="title"> 7664<a name="thread.synchronization.condvar_ref.condition_variable.wait_for_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for_predicate" title="template <class Rep, class Period, class Predicate> bool wait_for(boost::unique_lock<boost::mutex>& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred)"><code class="computeroutput"><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">class</span> <span class="identifier">Predicate</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">>&</span> 7665 <span class="identifier">lock</span><span class="special">,</span> 7666 <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="identifier">Predicate</span> 7667 <span class="identifier">pred</span><span class="special">)</span></code></a> 7668</h5></div></div></div> 7669<div class="variablelist"> 7670<p class="title"><b></b></p> 7671<dl class="variablelist"> 7672<dt><span class="term">Effects:</span></dt> 7673<dd> 7674<p> 7675 As-if 7676</p> 7677<pre class="programlisting"><span class="keyword">return</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</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">pred</span><span class="special">));</span> 7678</pre> 7679<p> 7680 </p> 7681</dd> 7682</dl> 7683</div> 7684</div> 7685</div> 7686<div class="section"> 7687<div class="titlepage"><div><div><h4 class="title"> 7688<a name="thread.synchronization.condvar_ref.condition_variable_any"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any" title="Class condition_variable_any">Class 7689 <code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a> 7690</h4></div></div></div> 7691<div class="toc"><dl class="toc"> 7692<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.constructor"><code class="computeroutput"><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a></span></dt> 7693<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a></span></dt> 7694<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_one"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a></span></dt> 7695<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_all"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a></span></dt> 7696<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> 7697 <span class="identifier">lock</span><span class="special">)</span></code></a></span></dt> 7698<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7699 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">predicate_type</span> 7700 <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt> 7701<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> 7702 <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</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></code></a></span></dt> 7703<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span> 7704 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> 7705 <span class="keyword">const</span><span class="special">&</span> 7706 <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt> 7707<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7708 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> 7709 <span class="keyword">const</span><span class="special">&</span> 7710 <span class="identifier">abs_time</span><span class="special">,</span> 7711 <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt> 7712<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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="identifier">cv_status</span> 7713 <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> 7714 <span class="identifier">lock</span><span class="special">,</span> 7715 <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></code></a></span></dt> 7716<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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="identifier">cv_status</span> 7717 <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> 7718 <span class="identifier">lock</span><span class="special">,</span> 7719 <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></code></a></span></dt> 7720<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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">class</span> <span class="identifier">Predicate</span><span class="special">></span> 7721 <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</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> 7722 <span class="identifier">abs_time</span><span class="special">,</span> 7723 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt> 7724<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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">class</span> <span class="identifier">Predicate</span><span class="special">></span> 7725 <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</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> 7726 <span class="identifier">rel_time</span><span class="special">,</span> 7727 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt> 7728</dl></div> 7729<pre class="programlisting"><span class="comment">//#include <boost/thread/condition_variable.hpp></span> 7730 7731<span class="keyword">namespace</span> <span class="identifier">boost</span> 7732<span class="special">{</span> 7733 <span class="keyword">class</span> <span class="identifier">condition_variable_any</span> 7734 <span class="special">{</span> 7735 <span class="keyword">public</span><span class="special">:</span> 7736 <span class="identifier">condition_variable_any</span><span class="special">();</span> 7737 <span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">();</span> 7738 7739 <span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">();</span> 7740 <span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">();</span> 7741 7742 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> 7743 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">);</span> 7744 7745 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7746 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span> 7747 7748 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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> 7749 <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span> 7750 <span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> 7751 <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> 7752 7753 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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">class</span> <span class="identifier">Predicate</span><span class="special">></span> 7754 <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span> 7755 <span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> 7756 <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> 7757 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span> 7758 7759 7760 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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> 7761 <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span> 7762 <span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> 7763 <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">d</span><span class="special">);</span> 7764 7765 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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">class</span> <span class="identifier">Predicate</span><span class="special">></span> 7766 <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span> 7767 <span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> 7768 <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">d</span><span class="special">,</span> 7769 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span> 7770 7771 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span> 7772 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> 7773 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</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> 7774 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span> 7775 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">);</span> 7776 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7777 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</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="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span> 7778 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7779 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span> 7780 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> 7781 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">>&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">);</span> 7782 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7783 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xtime</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">abs_time</span><span class="special">,</span><span class="identifier">predicate_type</span> <span class="identifier">predicate</span><span class="special">);</span> 7784 <span class="preprocessor">#endif</span> 7785 <span class="special">};</span> 7786<span class="special">}</span> 7787</pre> 7788<div class="section"> 7789<div class="titlepage"><div><div><h5 class="title"> 7790<a name="thread.synchronization.condvar_ref.condition_variable_any.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.constructor" title="condition_variable_any()"><code class="computeroutput"><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a> 7791</h5></div></div></div> 7792<div class="variablelist"> 7793<p class="title"><b></b></p> 7794<dl class="variablelist"> 7795<dt><span class="term">Effects:</span></dt> 7796<dd><p> 7797 Constructs an object of class <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>. 7798 </p></dd> 7799<dt><span class="term">Throws:</span></dt> 7800<dd><p> 7801 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7802 occurs. 7803 </p></dd> 7804</dl> 7805</div> 7806</div> 7807<div class="section"> 7808<div class="titlepage"><div><div><h5 class="title"> 7809<a name="thread.synchronization.condvar_ref.condition_variable_any.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.destructor" title="~condition_variable_any()"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a> 7810</h5></div></div></div> 7811<div class="variablelist"> 7812<p class="title"><b></b></p> 7813<dl class="variablelist"> 7814<dt><span class="term">Precondition:</span></dt> 7815<dd><p> 7816 All threads waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> have been notified by a call 7817 to <code class="computeroutput"><span class="identifier">notify_one</span></code> or 7818 <code class="computeroutput"><span class="identifier">notify_all</span></code> (though 7819 the respective calls to <code class="computeroutput"><span class="identifier">wait</span></code> 7820 or <code class="computeroutput"><span class="identifier">timed_wait</span></code> need 7821 not have returned). 7822 </p></dd> 7823<dt><span class="term">Effects:</span></dt> 7824<dd><p> 7825 Destroys the object. 7826 </p></dd> 7827<dt><span class="term">Throws:</span></dt> 7828<dd><p> 7829 Nothing. 7830 </p></dd> 7831</dl> 7832</div> 7833</div> 7834<div class="section"> 7835<div class="titlepage"><div><div><h5 class="title"> 7836<a name="thread.synchronization.condvar_ref.condition_variable_any.notify_one"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_one" title="void notify_one()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a> 7837</h5></div></div></div> 7838<div class="variablelist"> 7839<p class="title"><b></b></p> 7840<dl class="variablelist"> 7841<dt><span class="term">Effects:</span></dt> 7842<dd><p> 7843 If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting 7844 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 7845 in a call to <code class="computeroutput"><span class="identifier">wait</span></code> 7846 or <code class="computeroutput"><span class="identifier">timed_wait</span></code>, 7847 unblocks one of those threads. 7848 </p></dd> 7849<dt><span class="term">Throws:</span></dt> 7850<dd><p> 7851 Nothing. 7852 </p></dd> 7853</dl> 7854</div> 7855</div> 7856<div class="section"> 7857<div class="titlepage"><div><div><h5 class="title"> 7858<a name="thread.synchronization.condvar_ref.condition_variable_any.notify_all"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_all" title="void notify_all()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a> 7859</h5></div></div></div> 7860<div class="variablelist"> 7861<p class="title"><b></b></p> 7862<dl class="variablelist"> 7863<dt><span class="term">Effects:</span></dt> 7864<dd><p> 7865 If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting 7866 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 7867 in a call to <code class="computeroutput"><span class="identifier">wait</span></code> 7868 or <code class="computeroutput"><span class="identifier">timed_wait</span></code>, 7869 unblocks all of those threads. 7870 </p></dd> 7871<dt><span class="term">Throws:</span></dt> 7872<dd><p> 7873 Nothing. 7874 </p></dd> 7875</dl> 7876</div> 7877</div> 7878<div class="section"> 7879<div class="titlepage"><div><div><h5 class="title"> 7880<a name="thread.synchronization.condvar_ref.condition_variable_any.wait"></a><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="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> 7881 <span class="identifier">lock</span><span class="special">)</span></code></a> 7882</h5></div></div></div> 7883<div class="variablelist"> 7884<p class="title"><b></b></p> 7885<dl class="variablelist"> 7886<dt><span class="term">Effects:</span></dt> 7887<dd><p> 7888 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 7889 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 7890 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 7891 or spuriously. When the thread is unblocked (for whatever reason), 7892 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also 7893 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an 7894 exception. 7895 </p></dd> 7896<dt><span class="term">Postcondition:</span></dt> 7897<dd><p> 7898 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7899 by the current thread. 7900 </p></dd> 7901<dt><span class="term">Throws:</span></dt> 7902<dd><p> 7903 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7904 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 7905 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 7906 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 associated 7907 with the current thread of execution. 7908 </p></dd> 7909</dl> 7910</div> 7911</div> 7912<div class="section"> 7913<div class="titlepage"><div><div><h5 class="title"> 7914<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_predicate" title="template<typename lock_type,typename predicate_type> void wait(lock_type& lock, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 7915 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">predicate_type</span> 7916 <span class="identifier">pred</span><span class="special">)</span></code></a> 7917</h5></div></div></div> 7918<div class="variablelist"> 7919<p class="title"><b></b></p> 7920<dl class="variablelist"> 7921<dt><span class="term">Effects:</span></dt> 7922<dd> 7923<p> 7924 As-if 7925</p> 7926<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span> 7927<span class="special">{</span> 7928 <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span> 7929<span class="special">}</span> 7930</pre> 7931<p> 7932 </p> 7933</dd> 7934</dl> 7935</div> 7936</div> 7937<div class="section"> 7938<div class="titlepage"><div><div><h5 class="title"> 7939<a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait"></a><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="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">></span> <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> 7940 <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</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></code></a> 7941</h5></div></div></div> 7942<div class="variablelist"> 7943<p class="title"><b></b></p> 7944<dl class="variablelist"> 7945<dt><span class="term">Effects:</span></dt> 7946<dd><p> 7947 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 7948 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 7949 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 7950 when the time as reported by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()</span></code> would be equal to or later than 7951 the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>, 7952 or spuriously. When the thread is unblocked (for whatever reason), 7953 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also 7954 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an 7955 exception. 7956 </p></dd> 7957<dt><span class="term">Returns:</span></dt> 7958<dd><p> 7959 <code class="computeroutput"><span class="keyword">false</span></code> if the call 7960 is returning because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 7961 was reached, <code class="computeroutput"><span class="keyword">true</span></code> 7962 otherwise. 7963 </p></dd> 7964<dt><span class="term">Postcondition:</span></dt> 7965<dd><p> 7966 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 7967 by the current thread. 7968 </p></dd> 7969<dt><span class="term">Throws:</span></dt> 7970<dd><p> 7971 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 7972 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 7973 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 7974 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 associated 7975 with the current thread of execution. 7976 </p></dd> 7977</dl> 7978</div> 7979</div> 7980<div class="section"> 7981<div class="titlepage"><div><div><h5 class="title"> 7982<a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel" title="template<typename lock_type,typename duration_type> bool timed_wait(lock_type& lock,duration_type const& rel_time)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">></span> 7983 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> 7984 <span class="keyword">const</span><span class="special">&</span> 7985 <span class="identifier">rel_time</span><span class="special">)</span></code></a> 7986</h5></div></div></div> 7987<div class="variablelist"> 7988<p class="title"><b></b></p> 7989<dl class="variablelist"> 7990<dt><span class="term">Effects:</span></dt> 7991<dd><p> 7992 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 7993 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 7994 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 7995 after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code> 7996 argument has elapsed, or spuriously. When the thread is unblocked 7997 (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> 7998 before the call to <code class="computeroutput"><span class="identifier">wait</span></code> 7999 returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> 8000 if the function exits with an exception. 8001 </p></dd> 8002<dt><span class="term">Returns:</span></dt> 8003<dd><p> 8004 <code class="computeroutput"><span class="keyword">false</span></code> if the call 8005 is returning because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> has elapsed, <code class="computeroutput"><span class="keyword">true</span></code> otherwise. 8006 </p></dd> 8007<dt><span class="term">Postcondition:</span></dt> 8008<dd><p> 8009 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 8010 by the current thread. 8011 </p></dd> 8012<dt><span class="term">Throws:</span></dt> 8013<dd><p> 8014 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8015 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 8016 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 8017 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 associated 8018 with the current thread of execution. 8019 </p></dd> 8020</dl> 8021</div> 8022<div class="note"><table border="0" summary="Note"> 8023<tr> 8024<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 8025<th align="left">Note</th> 8026</tr> 8027<tr><td align="left" valign="top"><p> 8028 The duration overload of timed_wait is difficult to use correctly. 8029 The overload taking a predicate should be preferred in most cases. 8030 </p></td></tr> 8031</table></div> 8032</div> 8033<div class="section"> 8034<div class="titlepage"><div><div><h5 class="title"> 8035<a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate" title="template<typename lock_type,typename predicate_type> bool timed_wait(lock_type& lock, boost::system_time const& abs_time, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">></span> 8036 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> 8037 <span class="keyword">const</span><span class="special">&</span> 8038 <span class="identifier">abs_time</span><span class="special">,</span> 8039 <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a> 8040</h5></div></div></div> 8041<div class="variablelist"> 8042<p class="title"><b></b></p> 8043<dl class="variablelist"> 8044<dt><span class="term">Effects:</span></dt> 8045<dd> 8046<p> 8047 As-if 8048</p> 8049<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span> 8050<span class="special">{</span> 8051 <span class="keyword">if</span><span class="special">(!</span><span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span> 8052 <span class="special">{</span> 8053 <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span> 8054 <span class="special">}</span> 8055<span class="special">}</span> 8056<span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 8057</pre> 8058<p> 8059 </p> 8060</dd> 8061</dl> 8062</div> 8063</div> 8064<div class="section"> 8065<div class="titlepage"><div><div><h5 class="title"> 8066<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_until"></a><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="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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="identifier">cv_status</span> 8067 <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> 8068 <span class="identifier">lock</span><span class="special">,</span> 8069 <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></code></a> 8070</h5></div></div></div> 8071<div class="variablelist"> 8072<p class="title"><b></b></p> 8073<dl class="variablelist"> 8074<dt><span class="term">Effects:</span></dt> 8075<dd><p> 8076 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 8077 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 8078 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 8079 when the time as reported by <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code> would be equal to or later than 8080 the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>, 8081 or spuriously. When the thread is unblocked (for whatever reason), 8082 the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also 8083 reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an 8084 exception. 8085 </p></dd> 8086<dt><span class="term">Returns:</span></dt> 8087<dd><p> 8088 <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning 8089 because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 8090 was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code> 8091 otherwise. 8092 </p></dd> 8093<dt><span class="term">Postcondition:</span></dt> 8094<dd><p> 8095 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 8096 by the current thread. 8097 </p></dd> 8098<dt><span class="term">Throws:</span></dt> 8099<dd><p> 8100 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8101 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 8102 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 8103 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 associated 8104 with the current thread of execution. 8105 </p></dd> 8106</dl> 8107</div> 8108</div> 8109<div class="section"> 8110<div class="titlepage"><div><div><h5 class="title"> 8111<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_for"></a><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="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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="identifier">cv_status</span> 8112 <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> 8113 <span class="identifier">lock</span><span class="special">,</span> 8114 <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></code></a> 8115</h5></div></div></div> 8116<div class="variablelist"> 8117<p class="title"><b></b></p> 8118<dl class="variablelist"> 8119<dt><span class="term">Effects:</span></dt> 8120<dd><p> 8121 Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread. 8122 The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_one</span><span class="special">()</span></code> 8123 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">notify_all</span><span class="special">()</span></code>, 8124 after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code> 8125 argument has elapsed, or spuriously. When the thread is unblocked 8126 (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> 8127 before the call to <code class="computeroutput"><span class="identifier">wait</span></code> 8128 returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> 8129 if the function exits with an exception. 8130 </p></dd> 8131<dt><span class="term">Returns:</span></dt> 8132<dd><p> 8133 <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning 8134 because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code> 8135 was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code> 8136 otherwise. 8137 </p></dd> 8138<dt><span class="term">Postcondition:</span></dt> 8139<dd><p> 8140 <code class="computeroutput"><span class="identifier">lock</span></code> is locked 8141 by the current thread. 8142 </p></dd> 8143<dt><span class="term">Throws:</span></dt> 8144<dd><p> 8145 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8146 occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 8147 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 8148 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 associated 8149 with the current thread of execution. 8150 </p></dd> 8151</dl> 8152</div> 8153<div class="note"><table border="0" summary="Note"> 8154<tr> 8155<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 8156<th align="left">Note</th> 8157</tr> 8158<tr><td align="left" valign="top"><p> 8159 The duration overload of timed_wait is difficult to use correctly. 8160 The overload taking a predicate should be preferred in most cases. 8161 </p></td></tr> 8162</table></div> 8163</div> 8164<div class="section"> 8165<div class="titlepage"><div><div><h5 class="title"> 8166<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate" title="template <class lock_type, class Clock, class Duration, class Predicate> bool wait_until(lock_type& lock, const chrono::time_point<Clock, Duration>& abs_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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">class</span> <span class="identifier">Predicate</span><span class="special">></span> 8167 <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</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> 8168 <span class="identifier">abs_time</span><span class="special">,</span> 8169 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a> 8170</h5></div></div></div> 8171<div class="variablelist"> 8172<p class="title"><b></b></p> 8173<dl class="variablelist"> 8174<dt><span class="term">Effects:</span></dt> 8175<dd> 8176<p> 8177 As-if 8178</p> 8179<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span> 8180<span class="special">{</span> 8181 <span class="keyword">if</span><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><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span> 8182 <span class="special">{</span> 8183 <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span> 8184 <span class="special">}</span> 8185<span class="special">}</span> 8186<span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 8187</pre> 8188<p> 8189 </p> 8190</dd> 8191</dl> 8192</div> 8193</div> 8194<div class="section"> 8195<div class="titlepage"><div><div><h5 class="title"> 8196<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate" title="template <class lock_type, class Rep, class Period, class Predicate> bool wait_for(lock_type& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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">class</span> <span class="identifier">Predicate</span><span class="special">></span> 8197 <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&</span> <span class="identifier">lock</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> 8198 <span class="identifier">rel_time</span><span class="special">,</span> 8199 <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a> 8200</h5></div></div></div> 8201<div class="variablelist"> 8202<p class="title"><b></b></p> 8203<dl class="variablelist"> 8204<dt><span class="term">Effects:</span></dt> 8205<dd> 8206<p> 8207 As-if 8208</p> 8209<pre class="programlisting"><span class="keyword">return</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</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">pred</span><span class="special">));</span> 8210</pre> 8211<p> 8212 </p> 8213</dd> 8214</dl> 8215</div> 8216</div> 8217</div> 8218<div class="section"> 8219<div class="titlepage"><div><div><h4 class="title"> 8220<a name="thread.synchronization.condvar_ref.condition"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition" title="Typedef condition DEPRECATED V3">Typedef 8221 <code class="computeroutput"><span class="identifier">condition</span></code> DEPRECATED V3</a> 8222</h4></div></div></div> 8223<pre class="programlisting"><span class="comment">// #include <boost/thread/condition.hpp></span> 8224<span class="keyword">namespace</span> <span class="identifier">boost</span> 8225<span class="special">{</span> 8226 8227 <span class="keyword">typedef</span> <span class="identifier">condition_variable_any</span> <span class="identifier">condition</span><span class="special">;</span> 8228 8229<span class="special">}</span> 8230</pre> 8231<p> 8232 The typedef <code class="computeroutput"><span class="identifier">condition</span></code> is 8233 provided for backwards compatibility with previous boost releases. 8234 </p> 8235</div> 8236<div class="section"> 8237<div class="titlepage"><div><div><h4 class="title"> 8238<a name="thread.synchronization.condvar_ref.notify_all_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.notify_all_at_thread_exit" title="Non-member Function notify_all_at_thread_exit()">Non-member 8239 Function <code class="computeroutput"><span class="identifier">notify_all_at_thread_exit</span></code>()</a> 8240</h4></div></div></div> 8241<pre class="programlisting"><span class="comment">// #include <boost/thread/condition_variable.hpp></span> 8242 8243<span class="keyword">namespace</span> <span class="identifier">boost</span> 8244<span class="special">{</span> 8245 <span class="keyword">void</span> <span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">condition_variable</span><span class="special">&</span> <span class="identifier">cond</span><span class="special">,</span> <span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">);</span> 8246<span class="special">}</span> 8247</pre> 8248<div class="variablelist"> 8249<p class="title"><b></b></p> 8250<dl class="variablelist"> 8251<dt><span class="term">Requires:</span></dt> 8252<dd><p> 8253 <code class="computeroutput"><span class="identifier">lk</span></code> is locked by the 8254 calling thread and either no other thread is waiting on <code class="computeroutput"><span class="identifier">cond</span></code>, or <code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()</span></code> returns the same value for each 8255 of the lock arguments supplied by all concurrently waiting (via 8256 <code class="computeroutput"><span class="identifier">wait</span></code>, <code class="computeroutput"><span class="identifier">wait_for</span></code>, or <code class="computeroutput"><span class="identifier">wait_until</span></code>) 8257 threads. 8258 </p></dd> 8259<dt><span class="term">Effects:</span></dt> 8260<dd> 8261<p> 8262 transfers ownership of the lock associated with <code class="computeroutput"><span class="identifier">lk</span></code> 8263 into internal storage and schedules <code class="computeroutput"><span class="identifier">cond</span></code> 8264 to be notified when the current thread exits, after all objects of 8265 thread storage duration associated with the current thread have been 8266 destroyed. This notification shall be as if 8267 </p> 8268<p> 8269</p> 8270<pre class="programlisting"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> 8271<span class="identifier">cond</span><span class="special">.</span><span class="identifier">notify_all</span><span class="special">();</span> 8272</pre> 8273<p> 8274 </p> 8275</dd> 8276</dl> 8277</div> 8278</div> 8279</div> 8280<div class="section"> 8281<div class="titlepage"><div><div><h3 class="title"> 8282<a name="thread.synchronization.once"></a><a class="link" href="synchronization.html#thread.synchronization.once" title="One-time Initialization">One-time Initialization</a> 8283</h3></div></div></div> 8284<div class="toc"><dl class="toc"> 8285<dt><span class="section"><a href="synchronization.html#thread.synchronization.once.once_flag">Typedef <code class="computeroutput"><span class="identifier">once_flag</span></code></a></span></dt> 8286<dt><span class="section"><a href="synchronization.html#thread.synchronization.once.call_once">Non-member function 8287 <code class="computeroutput"><span class="identifier">call_once</span></code></a></span></dt> 8288</dl></div> 8289<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">once</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 8290 8291<span class="keyword">namespace</span> <span class="identifier">boost</span> 8292<span class="special">{</span> 8293 <span class="keyword">struct</span> <span class="identifier">once_flag</span><span class="special">;</span> 8294 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">...</span><span class="identifier">ArgTypes</span><span class="special">></span> 8295 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="identifier">once_flag</span><span class="special">&</span> <span class="identifier">flag</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">ArgTypes</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 8296 8297<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span> 8298 <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">func</span><span class="special">)(),</span><span class="identifier">once_flag</span><span class="special">&</span> <span class="identifier">flag</span><span class="special">);</span> 8299<span class="preprocessor">#endif</span> 8300 8301<span class="special">}</span> 8302</pre> 8303<div class="warning"><table border="0" summary="Warning"> 8304<tr> 8305<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 8306<th align="left">Warning</th> 8307</tr> 8308<tr><td align="left" valign="top"><p> 8309 the variadic prototype is provided only on C++11 compilers supporting variadic 8310 templates, otherwise the interface is limited up to 3 parameters. 8311 </p></td></tr> 8312</table></div> 8313<div class="warning"><table border="0" summary="Warning"> 8314<tr> 8315<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 8316<th align="left">Warning</th> 8317</tr> 8318<tr><td align="left" valign="top"><p> 8319 the move semantics is ensured only on C++11 compilers supporting SFINAE 8320 expression, decltype N3276 and auto. Waiting for a boost::bind that is 8321 move aware. 8322 </p></td></tr> 8323</table></div> 8324<p> 8325 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">call_once</span></code> provides a mechanism for ensuring 8326 that an initialization routine is run exactly once without data races or 8327 deadlocks. 8328 </p> 8329<div class="section"> 8330<div class="titlepage"><div><div><h4 class="title"> 8331<a name="thread.synchronization.once.once_flag"></a><a class="link" href="synchronization.html#thread.synchronization.once.once_flag" title="Typedef once_flag">Typedef <code class="computeroutput"><span class="identifier">once_flag</span></code></a> 8332</h4></div></div></div> 8333<pre class="programlisting"><span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_ONCE_CXX11</span> 8334<span class="keyword">struct</span> <span class="identifier">once_flag</span> 8335<span class="special">{</span> 8336 <span class="keyword">constexpr</span> <span class="identifier">once_flag</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 8337 <span class="identifier">once_flag</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">once_flag</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 8338 <span class="identifier">once_flag</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">once_flag</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 8339<span class="special">};</span> 8340<span class="preprocessor">#else</span> 8341<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">once_flag</span><span class="special">;</span> 8342<span class="preprocessor">#define</span> <span class="identifier">BOOST_ONCE_INIT</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">initializer</span> 8343<span class="preprocessor">#endif</span> 8344</pre> 8345<p> 8346 Objects of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">once_flag</span></code> shall be initialized with 8347 <code class="computeroutput"><span class="identifier">BOOST_ONCE_INIT</span></code> if BOOST_THREAD_PROVIDES_ONCE_CXX11 8348 is not defined 8349 </p> 8350<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">once_flag</span> <span class="identifier">f</span><span class="special">=</span><span class="identifier">BOOST_ONCE_INIT</span><span class="special">;</span> 8351</pre> 8352</div> 8353<div class="section"> 8354<div class="titlepage"><div><div><h4 class="title"> 8355<a name="thread.synchronization.once.call_once"></a><a class="link" href="synchronization.html#thread.synchronization.once.call_once" title="Non-member function call_once">Non-member function 8356 <code class="computeroutput"><span class="identifier">call_once</span></code></a> 8357</h4></div></div></div> 8358<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Function</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">...</span><span class="identifier">ArgTypes</span><span class="special">></span> 8359<span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="identifier">once_flag</span><span class="special">&</span> <span class="identifier">flag</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">ArgTypes</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 8360</pre> 8361<div class="variablelist"> 8362<p class="title"><b></b></p> 8363<dl class="variablelist"> 8364<dt><span class="term">Requires:</span></dt> 8365<dd><p> 8366 <code class="computeroutput"><span class="identifier">Function</span></code> and each 8367 or the <code class="computeroutput"><span class="identifier">ArgTypes</span></code> are 8368 <code class="computeroutput"><span class="identifier">MoveConstructible</span></code> 8369 and <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Function</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span> 8370 <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">ArgTypes</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code> 8371 shall be well formed. 8372 </p></dd> 8373<dt><span class="term">Effects:</span></dt> 8374<dd><p> 8375 Calls to <code class="computeroutput"><span class="identifier">call_once</span></code> 8376 on the same <code class="computeroutput"><span class="identifier">once_flag</span></code> 8377 object are serialized. If there has been no prior effective <code class="computeroutput"><span class="identifier">call_once</span></code> on the same <code class="computeroutput"><span class="identifier">once_flag</span></code> object, the argument 8378 <code class="computeroutput"><span class="identifier">func</span></code> is called as-if 8379 by invoking <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Function</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span> <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">ArgTypes</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code>, and the invocation of <code class="computeroutput"><span class="identifier">call_once</span></code> is effective if and only 8380 if <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Function</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span> 8381 <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">ArgTypes</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code> 8382 returns without exception. If an exception is thrown, the exception 8383 is propagated to the caller. If there has been a prior effective 8384 <code class="computeroutput"><span class="identifier">call_once</span></code> on the 8385 same <code class="computeroutput"><span class="identifier">once_flag</span></code> object, 8386 the <code class="computeroutput"><span class="identifier">call_once</span></code> returns 8387 without invoking <code class="computeroutput"><span class="identifier">func</span></code>. 8388 </p></dd> 8389<dt><span class="term">Synchronization:</span></dt> 8390<dd><p> 8391 The completion of an effective <code class="computeroutput"><span class="identifier">call_once</span></code> 8392 invocation on a <code class="computeroutput"><span class="identifier">once_flag</span></code> 8393 object, synchronizes with all subsequent <code class="computeroutput"><span class="identifier">call_once</span></code> 8394 invocations on the same <code class="computeroutput"><span class="identifier">once_flag</span></code> 8395 object. 8396 </p></dd> 8397<dt><span class="term">Throws:</span></dt> 8398<dd><p> 8399 <code class="computeroutput"><span class="identifier">thread_resource_error</span></code> 8400 when the effects cannot be achieved or any exception propagated from 8401 <code class="computeroutput"><span class="identifier">func</span></code>. 8402 </p></dd> 8403<dt><span class="term">Note:</span></dt> 8404<dd><p> 8405 The function passed to <code class="computeroutput"><span class="identifier">call_once</span></code> 8406 must not also call <code class="computeroutput"><span class="identifier">call_once</span></code> 8407 passing the same <code class="computeroutput"><span class="identifier">once_flag</span></code> 8408 object. This may cause deadlock, or invoking the passed function 8409 a second time. The alternative is to allow the second call to return 8410 immediately, but that assumes the code knows it has been called recursively, 8411 and can proceed even though the call to <code class="computeroutput"><span class="identifier">call_once</span></code> 8412 didn't actually call the function, in which case it could also avoid 8413 calling <code class="computeroutput"><span class="identifier">call_once</span></code> 8414 recursively. 8415 </p></dd> 8416<dt><span class="term">Note:</span></dt> 8417<dd><p> 8418 On some compilers this function has some restrictions, e.g. if variadic 8419 templates are not supported the number of arguments is limited to 8420 3; . 8421 </p></dd> 8422</dl> 8423</div> 8424<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">func</span><span class="special">)(),</span><span class="identifier">once_flag</span><span class="special">&</span> <span class="identifier">flag</span><span class="special">);</span> 8425</pre> 8426<p> 8427 This second overload is provided for backwards compatibility and is deprecated. 8428 The effects of <code class="computeroutput"><span class="identifier">call_once</span><span class="special">(</span><span class="identifier">func</span><span class="special">,</span><span class="identifier">flag</span><span class="special">)</span></code> shall be the same as those of <code class="computeroutput"><span class="identifier">call_once</span><span class="special">(</span><span class="identifier">flag</span><span class="special">,</span><span class="identifier">func</span><span class="special">)</span></code>. 8429 </p> 8430</div> 8431</div> 8432<div class="section"> 8433<div class="titlepage"><div><div><h3 class="title"> 8434<a name="thread.synchronization.barriers"></a><a class="link" href="synchronization.html#thread.synchronization.barriers" title="Barriers -- EXTENSION">Barriers -- EXTENSION</a> 8435</h3></div></div></div> 8436<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier">Class <code class="computeroutput"><span class="identifier">barrier</span></code></a></span></dt></dl></div> 8437<p> 8438 A barrier is a simple concept. Also known as a <span class="emphasis"><em>rendezvous</em></span>, 8439 it is a synchronization point between multiple threads. The barrier is configured 8440 for a particular number of threads (<code class="computeroutput"><span class="identifier">n</span></code>), 8441 and as threads reach the barrier they must wait until all <code class="computeroutput"><span class="identifier">n</span></code> 8442 threads have arrived. Once the <code class="computeroutput"><span class="identifier">n</span></code>-th 8443 thread has reached the barrier, all the waiting threads can proceed, and 8444 the barrier is reset. 8445 </p> 8446<div class="section"> 8447<div class="titlepage"><div><div><h4 class="title"> 8448<a name="thread.synchronization.barriers.barrier"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier" title="Class barrier">Class <code class="computeroutput"><span class="identifier">barrier</span></code></a> 8449</h4></div></div></div> 8450<div class="toc"><dl class="toc"> 8451<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__">Constructor 8452 <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)</span></code></a></span></dt> 8453<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____">Constructor 8454 <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&)</span></code></a></span></dt> 8455<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.destructor___barrier___">Destructor 8456 <code class="computeroutput"><span class="special">~</span><span class="identifier">barrier</span><span class="special">()</span></code></a></span></dt> 8457<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.member_function__wait___">Member 8458 Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a></span></dt> 8459<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.member_function__count_down_and_wait___">Member 8460 Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a></span></dt> 8461</dl></div> 8462<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">barrier</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 8463 8464<span class="keyword">class</span> <span class="identifier">barrier</span> 8465<span class="special">{</span> 8466<span class="keyword">public</span><span class="special">:</span> 8467 <span class="identifier">barrier</span><span class="special">(</span><span class="identifier">barrier</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 8468 <span class="identifier">barrier</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">barrier</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 8469 8470 <span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">);</span> 8471 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 8472 <span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&);</span> 8473 8474 <span class="special">~</span><span class="identifier">barrier</span><span class="special">();</span> 8475 8476 <span class="keyword">bool</span> <span class="identifier">wait</span><span class="special">();</span> 8477 <span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span> 8478<span class="special">};</span> 8479</pre> 8480<p> 8481 Instances of <a class="link" href="synchronization.html#thread.synchronization.barriers.barrier" title="Class barrier"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">barrier</span></code></a> are not copyable or movable. 8482 </p> 8483<div class="section"> 8484<div class="titlepage"><div><div><h5 class="title"> 8485<a name="thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__" title="Constructor barrier(unsigned int)">Constructor 8486 <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)</span></code></a> 8487</h5></div></div></div> 8488<pre class="programlisting"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">);</span> 8489</pre> 8490<div class="variablelist"> 8491<p class="title"><b></b></p> 8492<dl class="variablelist"> 8493<dt><span class="term">Effects:</span></dt> 8494<dd><p> 8495 Construct a barrier for <code class="computeroutput"><span class="identifier">count</span></code> 8496 threads. 8497 </p></dd> 8498<dt><span class="term">Throws:</span></dt> 8499<dd><p> 8500 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8501 occurs. 8502 </p></dd> 8503</dl> 8504</div> 8505</div> 8506<div class="section"> 8507<div class="titlepage"><div><div><h5 class="title"> 8508<a name="thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____" title="Constructor barrier(unsigned int, F&&)">Constructor 8509 <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&)</span></code></a> 8510</h5></div></div></div> 8511<pre class="programlisting"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">completion</span><span class="special">);</span> 8512</pre> 8513<div class="variablelist"> 8514<p class="title"><b></b></p> 8515<dl class="variablelist"> 8516<dt><span class="term">Requires:</span></dt> 8517<dd><p> 8518 The result type of the completion function call <code class="computeroutput"><span class="identifier">completion</span><span class="special">()</span></code> is <code class="computeroutput"><span class="keyword">void</span></code> 8519 or <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">int</span></code>. 8520 </p></dd> 8521<dt><span class="term">Effects:</span></dt> 8522<dd><p> 8523 Construct a barrier for <code class="computeroutput"><span class="identifier">count</span></code> 8524 threads and a completion function <code class="computeroutput"><span class="identifier">completion</span></code>. 8525 </p></dd> 8526<dt><span class="term">Throws:</span></dt> 8527<dd><p> 8528 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8529 occurs. 8530 </p></dd> 8531</dl> 8532</div> 8533</div> 8534<div class="section"> 8535<div class="titlepage"><div><div><h5 class="title"> 8536<a name="thread.synchronization.barriers.barrier.destructor___barrier___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.destructor___barrier___" title="Destructor ~barrier()">Destructor 8537 <code class="computeroutput"><span class="special">~</span><span class="identifier">barrier</span><span class="special">()</span></code></a> 8538</h5></div></div></div> 8539<pre class="programlisting"><span class="special">~</span><span class="identifier">barrier</span><span class="special">();</span> 8540</pre> 8541<div class="variablelist"> 8542<p class="title"><b></b></p> 8543<dl class="variablelist"> 8544<dt><span class="term">Precondition:</span></dt> 8545<dd><p> 8546 No threads are waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 8547 </p></dd> 8548<dt><span class="term">Effects:</span></dt> 8549<dd><p> 8550 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 8551 </p></dd> 8552<dt><span class="term">Throws:</span></dt> 8553<dd><p> 8554 Nothing. 8555 </p></dd> 8556</dl> 8557</div> 8558</div> 8559<div class="section"> 8560<div class="titlepage"><div><div><h5 class="title"> 8561<a name="thread.synchronization.barriers.barrier.member_function__wait___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.member_function__wait___" title="Member Function wait()">Member 8562 Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a> 8563</h5></div></div></div> 8564<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">wait</span><span class="special">();</span> 8565</pre> 8566<div class="variablelist"> 8567<p class="title"><b></b></p> 8568<dl class="variablelist"> 8569<dt><span class="term">Effects:</span></dt> 8570<dd><p> 8571 Block until <code class="computeroutput"><span class="identifier">count</span></code> 8572 threads have called <code class="computeroutput"><span class="identifier">wait</span></code> 8573 or <code class="computeroutput"><span class="identifier">count_down_and_wait</span></code> 8574 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 8575 When the <code class="computeroutput"><span class="identifier">count</span></code>-th 8576 thread calls <code class="computeroutput"><span class="identifier">wait</span></code>, 8577 the barrier is reset and all waiting threads are unblocked. The 8578 reset depends on whether the barrier was constructed with a completion 8579 function or not. If there is no completion function or if the completion 8580 function result is void, the reset consists in restoring the original 8581 count. Otherwise the rest consist in assigning the result of the 8582 completion function (which must not be 0). 8583 </p></dd> 8584<dt><span class="term">Returns:</span></dt> 8585<dd><p> 8586 <code class="computeroutput"><span class="keyword">true</span></code> for exactly one 8587 thread from each batch of waiting threads, <code class="computeroutput"><span class="keyword">false</span></code> 8588 otherwise. 8589 </p></dd> 8590<dt><span class="term">Throws:</span></dt> 8591<dd> 8592<p> 8593 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8594 occurs. 8595 </p> 8596<p> 8597 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 8598 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 8599 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 associated 8600 with the current thread of execution. 8601 </p> 8602</dd> 8603<dt><span class="term">Notes:</span></dt> 8604<dd><p> 8605 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> 8606 is an <span class="emphasis"><em>interruption point</em></span>. 8607 </p></dd> 8608</dl> 8609</div> 8610</div> 8611<div class="section"> 8612<div class="titlepage"><div><div><h5 class="title"> 8613<a name="thread.synchronization.barriers.barrier.member_function__count_down_and_wait___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.member_function__count_down_and_wait___" title="Member Function count_down_and_wait()">Member 8614 Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a> 8615</h5></div></div></div> 8616<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span> 8617</pre> 8618<div class="variablelist"> 8619<p class="title"><b></b></p> 8620<dl class="variablelist"> 8621<dt><span class="term">Effects:</span></dt> 8622<dd><p> 8623 Block until <code class="computeroutput"><span class="identifier">count</span></code> 8624 threads have called <code class="computeroutput"><span class="identifier">wait</span></code> 8625 or <code class="computeroutput"><span class="identifier">count_down_and_wait</span></code> 8626 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 8627 When the <code class="computeroutput"><span class="identifier">count</span></code>-th 8628 thread calls <code class="computeroutput"><span class="identifier">wait</span></code>, 8629 the barrier is reset and all waiting threads are unblocked. The 8630 reset depends on whether the barrier was constructed with a completion 8631 function or not. If there is no completion function or if the completion 8632 function result is void, the reset consists in restoring the original 8633 count. Otherwise the rest consist in assigning the result of the 8634 completion function (which must not be 0). 8635 </p></dd> 8636<dt><span class="term">Throws:</span></dt> 8637<dd> 8638<p> 8639 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8640 occurs. 8641 </p> 8642<p> 8643 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 8644 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 8645 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 associated 8646 with the current thread of execution. 8647 </p> 8648</dd> 8649<dt><span class="term">Notes:</span></dt> 8650<dd><p> 8651 <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code> is an <span class="emphasis"><em>interruption 8652 point</em></span>. 8653 </p></dd> 8654</dl> 8655</div> 8656</div> 8657</div> 8658</div> 8659<div class="section"> 8660<div class="titlepage"><div><div><h3 class="title"> 8661<a name="thread.synchronization.latches"></a><a class="link" href="synchronization.html#thread.synchronization.latches" title="Latches -- EXPERIMENTAL">Latches -- EXPERIMENTAL</a> 8662</h3></div></div></div> 8663<div class="toc"><dl class="toc"> 8664<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.introdcution">Introdcution</a></span></dt> 8665<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.examples">Examples</a></span></dt> 8666<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch">Class <code class="computeroutput"><span class="identifier">latch</span></code></a></span></dt> 8667</dl></div> 8668<div class="section"> 8669<div class="titlepage"><div><div><h4 class="title"> 8670<a name="thread.synchronization.latches.introdcution"></a><a class="link" href="synchronization.html#thread.synchronization.latches.introdcution" title="Introdcution">Introdcution</a> 8671</h4></div></div></div> 8672<p> 8673 Latches are a thread co-ordination mechanism that allow one or more threads 8674 to block until one or more threads have reached a point. 8675 </p> 8676</div> 8677<div class="section"> 8678<div class="titlepage"><div><div><h4 class="title"> 8679<a name="thread.synchronization.latches.examples"></a><a class="link" href="synchronization.html#thread.synchronization.latches.examples" title="Examples">Examples</a> 8680</h4></div></div></div> 8681<p> 8682 Sample use cases for the latch include: 8683 </p> 8684<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 8685<li class="listitem"> 8686 Setting multiple threads to perform a task, and then waiting until 8687 all threads have reached a common point. 8688 </li> 8689<li class="listitem"> 8690 Creating multiple threads, which wait for a signal before advancing 8691 beyond a common point. 8692 </li> 8693</ul></div> 8694<p> 8695 An example of the first use case would be as follows: 8696 </p> 8697<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">DoWork</span><span class="special">(</span><span class="identifier">thread_pool</span><span class="special">*</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span> 8698 <span class="identifier">latch</span> <span class="identifier">completion_latch</span><span class="special">(</span><span class="identifier">NTASKS</span><span class="special">);</span> 8699 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">NTASKS</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 8700 <span class="identifier">pool</span><span class="special">-></span><span class="identifier">submit</span><span class="special">([&]</span> <span class="special">{</span> 8701 <span class="comment">// perform work</span> 8702 <span class="special">...</span> 8703 <span class="identifier">completion_latch</span><span class="special">.</span><span class="identifier">count_down</span><span class="special">();</span> 8704 <span class="special">}));</span> 8705 <span class="special">}</span> 8706 <span class="comment">// Block until work is done</span> 8707 <span class="identifier">completion_latch</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span> 8708<span class="special">}</span> 8709</pre> 8710<p> 8711 An example of the second use case is shown below. We need to load data 8712 and then process it using a number of threads. Loading the data is I/O 8713 bound, whereas starting threads and creating data structures is CPU bound. 8714 By running these in parallel, throughput can be increased. 8715 </p> 8716<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">DoWork</span><span class="special">()</span> <span class="special">{</span> 8717 <span class="identifier">latch</span> <span class="identifier">start_latch</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> 8718 <span class="identifier">vector</span><span class="special"><</span><span class="identifier">thread</span><span class="special">*></span> <span class="identifier">workers</span><span class="special">;</span> 8719 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">NTHREADS</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 8720 <span class="identifier">workers</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">thread</span><span class="special">([&]</span> <span class="special">{</span> 8721 <span class="comment">// Initialize data structures. This is CPU bound.</span> 8722 <span class="special">...</span> 8723 <span class="identifier">start_latch</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span> 8724 <span class="comment">// perform work</span> 8725 <span class="special">...</span> 8726 <span class="special">}));</span> 8727 <span class="special">}</span> 8728 <span class="comment">// Load input data. This is I/O bound.</span> 8729 <span class="special">...</span> 8730 <span class="comment">// Threads can now start processing</span> 8731 <span class="identifier">start_latch</span><span class="special">.</span><span class="identifier">count_down</span><span class="special">();</span> 8732 <span class="special">}</span> 8733</pre> 8734</div> 8735<div class="section"> 8736<div class="titlepage"><div><div><h4 class="title"> 8737<a name="thread.synchronization.latches.latch"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch" title="Class latch">Class <code class="computeroutput"><span class="identifier">latch</span></code></a> 8738</h4></div></div></div> 8739<div class="toc"><dl class="toc"> 8740<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.constructor__latch_std__size_t__">Constructor 8741 <code class="computeroutput"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)</span></code></a></span></dt> 8742<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.destructor___latch___">Destructor 8743 <code class="computeroutput"><span class="special">~</span><span class="identifier">latch</span><span class="special">()</span></code></a></span></dt> 8744<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait">Member 8745 Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a></span></dt> 8746<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.try_wait">Member 8747 Function <code class="computeroutput"><span class="identifier">try_wait</span><span class="special">()</span></code></a></span></dt> 8748<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait_for">Member 8749 Function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span> 8750 </code></a></span></dt> 8751<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait_until">Member 8752 Function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a></span></dt> 8753<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.count_down">Member 8754 Function <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code></a></span></dt> 8755<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.count_down_and_wait">Member 8756 Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a></span></dt> 8757<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.reset">Member 8758 Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a></span></dt> 8759</dl></div> 8760<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">latch</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 8761 8762<span class="keyword">class</span> <span class="identifier">latch</span> 8763<span class="special">{</span> 8764<span class="keyword">public</span><span class="special">:</span> 8765 <span class="identifier">latch</span><span class="special">(</span><span class="identifier">latch</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 8766 <span class="identifier">latch</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">latch</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 8767 8768 <span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">count</span><span class="special">);</span> 8769 <span class="special">~</span><span class="identifier">latch</span><span class="special">();</span> 8770 8771 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span> 8772 <span class="keyword">bool</span> <span class="identifier">try_wait</span><span class="special">();</span> 8773 <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> 8774 <span class="identifier">cv_status</span> <span class="identifier">wait_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> 8775 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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> 8776 <span class="identifier">cv_status</span> <span class="identifier">wait_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> 8777 <span class="keyword">void</span> <span class="identifier">count_down</span><span class="special">();</span> 8778 <span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span> 8779 8780<span class="special">};</span> 8781</pre> 8782<p> 8783 A latch maintains an internal counter that is initialized when the latch 8784 is created. One or more threads may block waiting until the counter is 8785 decremented to 0. 8786 </p> 8787<p> 8788 Instances of <a class="link" href="synchronization.html#thread.synchronization.latches.latch" title="Class latch"><code class="computeroutput"><span class="identifier">latch</span></code></a> are not copyable or movable. 8789 </p> 8790<div class="section"> 8791<div class="titlepage"><div><div><h5 class="title"> 8792<a name="thread.synchronization.latches.latch.constructor__latch_std__size_t__"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.constructor__latch_std__size_t__" title="Constructor latch(std::size_t)">Constructor 8793 <code class="computeroutput"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)</span></code></a> 8794</h5></div></div></div> 8795<pre class="programlisting"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">count</span><span class="special">);</span> 8796</pre> 8797<div class="variablelist"> 8798<p class="title"><b></b></p> 8799<dl class="variablelist"> 8800<dt><span class="term">Effects:</span></dt> 8801<dd><p> 8802 Construct a latch with is initial value for the internal counter. 8803 </p></dd> 8804<dt><span class="term">Note:</span></dt> 8805<dd><p> 8806 The counter could be zero. 8807 </p></dd> 8808<dt><span class="term">Throws:</span></dt> 8809<dd><p> 8810 Nothing. 8811 </p></dd> 8812</dl> 8813</div> 8814</div> 8815<div class="section"> 8816<div class="titlepage"><div><div><h5 class="title"> 8817<a name="thread.synchronization.latches.latch.destructor___latch___"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.destructor___latch___" title="Destructor ~latch()">Destructor 8818 <code class="computeroutput"><span class="special">~</span><span class="identifier">latch</span><span class="special">()</span></code></a> 8819</h5></div></div></div> 8820<pre class="programlisting"><span class="special">~</span><span class="identifier">latch</span><span class="special">();</span> 8821</pre> 8822<div class="variablelist"> 8823<p class="title"><b></b></p> 8824<dl class="variablelist"> 8825<dt><span class="term">Precondition:</span></dt> 8826<dd><p> 8827 No threads are waiting or invoking count_down on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 8828 </p></dd> 8829<dt><span class="term">Effects:</span></dt> 8830<dd><p> 8831 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 8832 latch. 8833 </p></dd> 8834<dt><span class="term">Throws:</span></dt> 8835<dd><p> 8836 Nothing. 8837 </p></dd> 8838</dl> 8839</div> 8840</div> 8841<div class="section"> 8842<div class="titlepage"><div><div><h5 class="title"> 8843<a name="thread.synchronization.latches.latch.wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait" title="Member Function wait()">Member 8844 Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a> 8845</h5></div></div></div> 8846<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span> 8847</pre> 8848<div class="variablelist"> 8849<p class="title"><b></b></p> 8850<dl class="variablelist"> 8851<dt><span class="term">Effects:</span></dt> 8852<dd><p> 8853 Block the calling thread until the internal count reaches the value 8854 zero. Then all waiting threads are unblocked. 8855 </p></dd> 8856<dt><span class="term">Throws:</span></dt> 8857<dd> 8858<p> 8859 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8860 occurs. 8861 </p> 8862<p> 8863 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 8864 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 8865 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 associated 8866 with the current thread of execution. 8867 </p> 8868</dd> 8869<dt><span class="term">Notes:</span></dt> 8870<dd><p> 8871 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> 8872 is an <span class="emphasis"><em>interruption point</em></span>. 8873 </p></dd> 8874</dl> 8875</div> 8876</div> 8877<div class="section"> 8878<div class="titlepage"><div><div><h5 class="title"> 8879<a name="thread.synchronization.latches.latch.try_wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.try_wait" title="Member Function try_wait()">Member 8880 Function <code class="computeroutput"><span class="identifier">try_wait</span><span class="special">()</span></code></a> 8881</h5></div></div></div> 8882<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">try_wait</span><span class="special">();</span> 8883</pre> 8884<div class="variablelist"> 8885<p class="title"><b></b></p> 8886<dl class="variablelist"> 8887<dt><span class="term">Returns:</span></dt> 8888<dd><p> 8889 Returns true if the internal count is 0, and false otherwise. Does 8890 not block the calling thread. 8891 </p></dd> 8892<dt><span class="term">Throws:</span></dt> 8893<dd><p> 8894 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8895 occurs. 8896 </p></dd> 8897</dl> 8898</div> 8899</div> 8900<div class="section"> 8901<div class="titlepage"><div><div><h5 class="title"> 8902<a name="thread.synchronization.latches.latch.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait_for" title="Member Function wait_for()">Member 8903 Function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span> 8904 </code></a> 8905</h5></div></div></div> 8906<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> 8907<span class="identifier">cv_status</span> <span class="identifier">wait_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> 8908</pre> 8909<div class="variablelist"> 8910<p class="title"><b></b></p> 8911<dl class="variablelist"> 8912<dt><span class="term">Effects:</span></dt> 8913<dd><p> 8914 Block the calling thread until the internal count reaches the value 8915 zero or the duration has been elapsed. If no timeout, all waiting 8916 threads are unblocked. 8917 </p></dd> 8918<dt><span class="term">Returns:</span></dt> 8919<dd><p> 8920 cv_status::no_timeout if the internal count is 0, and cv_status::timeout 8921 if duration has been elapsed. 8922 </p></dd> 8923<dt><span class="term">Throws:</span></dt> 8924<dd> 8925<p> 8926 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8927 occurs. 8928 </p> 8929<p> 8930 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 8931 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 8932 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 associated 8933 with the current thread of execution. 8934 </p> 8935</dd> 8936<dt><span class="term">Notes:</span></dt> 8937<dd><p> 8938 <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code> 8939 is an <span class="emphasis"><em>interruption point</em></span>. 8940 </p></dd> 8941</dl> 8942</div> 8943</div> 8944<div class="section"> 8945<div class="titlepage"><div><div><h5 class="title"> 8946<a name="thread.synchronization.latches.latch.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait_until" title="Member Function wait_until()">Member 8947 Function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a> 8948</h5></div></div></div> 8949<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">lock_type</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> 8950<span class="identifier">cv_status</span> <span class="identifier">wait_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> 8951</pre> 8952<div class="variablelist"> 8953<p class="title"><b></b></p> 8954<dl class="variablelist"> 8955<dt><span class="term">Effects:</span></dt> 8956<dd><p> 8957 Block the calling thread until the internal count reaches the value 8958 zero or the time_point has been reached. If no timeout, all waiting 8959 threads are unblocked. 8960 </p></dd> 8961<dt><span class="term">Returns:</span></dt> 8962<dd><p> 8963 cv_status::no_timeout if the internal count is 0, and cv_status::timeout 8964 if time_point has been reached. 8965 </p></dd> 8966<dt><span class="term">Throws:</span></dt> 8967<dd> 8968<p> 8969 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 8970 occurs. 8971 </p> 8972<p> 8973 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 8974 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 8975 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 associated 8976 with the current thread of execution. 8977 </p> 8978</dd> 8979<dt><span class="term">Notes:</span></dt> 8980<dd><p> 8981 <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code> 8982 is an <span class="emphasis"><em>interruption point</em></span>. 8983 </p></dd> 8984</dl> 8985</div> 8986</div> 8987<div class="section"> 8988<div class="titlepage"><div><div><h5 class="title"> 8989<a name="thread.synchronization.latches.latch.count_down"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.count_down" title="Member Function count_down()">Member 8990 Function <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code></a> 8991</h5></div></div></div> 8992<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down</span><span class="special">();</span> 8993</pre> 8994<div class="variablelist"> 8995<p class="title"><b></b></p> 8996<dl class="variablelist"> 8997<dt><span class="term">Requires:</span></dt> 8998<dd><p> 8999 The internal counter is non zero. 9000 </p></dd> 9001<dt><span class="term">Effects:</span></dt> 9002<dd><p> 9003 Decrements the internal count by 1, and returns. If the count reaches 9004 0, any threads blocked in wait() will be released. 9005 </p></dd> 9006<dt><span class="term">Throws:</span></dt> 9007<dd> 9008<p> 9009 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 9010 occurs. 9011 </p> 9012<p> 9013 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 9014 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 9015 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 associated 9016 with the current thread of execution. 9017 </p> 9018</dd> 9019<dt><span class="term">Notes:</span></dt> 9020<dd><p> 9021 <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code> 9022 is an <span class="emphasis"><em>interruption point</em></span>. 9023 </p></dd> 9024</dl> 9025</div> 9026</div> 9027<div class="section"> 9028<div class="titlepage"><div><div><h5 class="title"> 9029<a name="thread.synchronization.latches.latch.count_down_and_wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.count_down_and_wait" title="Member Function count_down_and_wait()">Member 9030 Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a> 9031</h5></div></div></div> 9032<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span> 9033</pre> 9034<div class="variablelist"> 9035<p class="title"><b></b></p> 9036<dl class="variablelist"> 9037<dt><span class="term">Requires:</span></dt> 9038<dd><p> 9039 The internal counter is non zero. 9040 </p></dd> 9041<dt><span class="term">Effects:</span></dt> 9042<dd><p> 9043 Decrements the internal count by 1. If the resulting count is not 9044 0, blocks the calling thread until the internal count is decremented 9045 to 0 by one or more other threads calling count_down() or count_down_and_wait(). 9046 </p></dd> 9047<dt><span class="term">Throws:</span></dt> 9048<dd> 9049<p> 9050 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 9051 occurs. 9052 </p> 9053<p> 9054 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait 9055 was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a> 9056 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 associated 9057 with the current thread of execution. 9058 </p> 9059</dd> 9060<dt><span class="term">Notes:</span></dt> 9061<dd><p> 9062 <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code> is an <span class="emphasis"><em>interruption 9063 point</em></span>. 9064 </p></dd> 9065</dl> 9066</div> 9067</div> 9068<p> 9069 [ 9070 </p> 9071<div class="section"> 9072<div class="titlepage"><div><div><h5 class="title"> 9073<a name="thread.synchronization.latches.latch.reset"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.reset" title="Member Function reset()">Member 9074 Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a> 9075</h5></div></div></div> 9076<pre class="programlisting"><span class="identifier">reset</span><span class="special">(</span> <span class="identifier">size_t</span> <span class="special">);</span> 9077</pre> 9078<div class="variablelist"> 9079<p class="title"><b></b></p> 9080<dl class="variablelist"> 9081<dt><span class="term">Requires:</span></dt> 9082<dd><p> 9083 This function may only be invoked when there are no other threads 9084 currently inside the waiting functions. 9085 </p></dd> 9086<dt><span class="term">Returns:</span></dt> 9087<dd><p> 9088 Resets the latch with a new value for the initial thread count. 9089 </p></dd> 9090<dt><span class="term">Throws:</span></dt> 9091<dd><p> 9092 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error 9093 occurs. 9094 </p></dd> 9095</dl> 9096</div> 9097</div> 9098<p> 9099 ] 9100 </p> 9101</div> 9102</div> 9103<div class="section"> 9104<div class="titlepage"><div><div><h3 class="title"> 9105<a name="thread.synchronization.executors"></a><a class="link" href="synchronization.html#thread.synchronization.executors" title="Executors and Schedulers -- EXPERIMENTAL">Executors and Schedulers 9106 -- EXPERIMENTAL</a> 9107</h3></div></div></div> 9108<div class="toc"><dl class="toc"> 9109<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.introduction">Introduction</a></span></dt> 9110<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.examples">Examples</a></span></dt> 9111<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.rationale">Design 9112 Rationale</a></span></dt> 9113<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref">Reference</a></span></dt> 9114</dl></div> 9115<div class="warning"><table border="0" summary="Warning"> 9116<tr> 9117<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 9118<th align="left">Warning</th> 9119</tr> 9120<tr><td align="left" valign="top"><p> 9121 These features are experimental and subject to change in future versions. 9122 There are not too much tests yet, so it is possible that you can find out 9123 some trivial bugs :( 9124 </p></td></tr> 9125</table></div> 9126<div class="note"><table border="0" summary="Note"> 9127<tr> 9128<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 9129<th align="left">Note</th> 9130</tr> 9131<tr><td align="left" valign="top"><p> 9132 These features are based on the <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3785.pdf" target="_top"><span class="bold"><strong>N3785 - Executors and Schedulers revision 3</strong></span></a> 9133 C++1y proposal from Chris Mysen, Niklas Gustafsson, Matt Austern, Jeffrey 9134 Yasskin. The text that follows has been adapted from this paper to show 9135 the differences. 9136 </p></td></tr> 9137</table></div> 9138<p> 9139 Executors are objects that can execute units of work packaged as function 9140 objects. Boost.Thread differs from N3785 mainly in the an Executor doesn't 9141 needs to inherit from an abstract class Executor. Static polymorphism is 9142 used instead and type erasure is used internally. 9143 </p> 9144<div class="section"> 9145<div class="titlepage"><div><div><h4 class="title"> 9146<a name="thread.synchronization.executors.introduction"></a><a class="link" href="synchronization.html#thread.synchronization.executors.introduction" title="Introduction">Introduction</a> 9147</h4></div></div></div> 9148<p> 9149 Multithreaded programs often involve discrete (sometimes small) units of 9150 work that are executed asynchronously. This often involves passing work 9151 units to some component that manages execution. We already have boost::async, 9152 which potentially executes a function asynchronously and eventually returns 9153 its result in a future. (“As if” by launching a new thread.) 9154 </p> 9155<p> 9156 If there is a regular stream of small work items then we almost certainly 9157 don’t want to launch a new thread for each, and it’s likely that we 9158 want at least some control over which thread(s) execute which items. It 9159 is often convenient to represent that control as multiple executor objects. 9160 This allows programs to start executors when necessary, switch from one 9161 executor to another to control execution policy, and use multiple executors 9162 to prevent interference and thread exhaustion. Several possible implementations 9163 exist of the executor class and in practice there are a number of main 9164 groups of executors which have been found to be useful in real-world code 9165 (more implementations exist, this is simply a high level classification 9166 of them). These differ along a couple main dimensions, how many execution 9167 contexts will be used, how they are selected, and how they are prioritized. 9168 </p> 9169<div class="orderedlist"><ol class="orderedlist" type="1"> 9170<li class="listitem"> 9171 Thread Pools 9172 <div class="orderedlist"><ol class="orderedlist" type="a"> 9173<li class="listitem"> 9174 Simple unbounded thread pool, which can queue up an unbounded 9175 amount of work and maintains a dedicated set of threads (up to 9176 some maximum) which dequeue and execute work as available. 9177 </li> 9178<li class="listitem"> 9179 Bounded thread pools, which can be implemented as a specialization 9180 of the previous ones with a bounded queue or semaphore, which 9181 limits the amount of queuing in an attempt to bound the time 9182 spent waiting to execute and/or limit resource utilization for 9183 work tasks which hold state which is expensive to hold. 9184 </li> 9185<li class="listitem"> 9186 Thread-spawning executors, in which each work always executes 9187 in a new thread. 9188 </li> 9189<li class="listitem"> 9190 Prioritized thread pools, which have works which are not equally 9191 prioritized such that work can move to the front of the execution 9192 queue if necessary. This requires a special comparator or prioritization 9193 function to allow for work ordering and normally is implemented 9194 as a blocking priority queue in front of the pool instead of 9195 a blocking queue. This has many uses but is a somewhat specialized 9196 in nature and would unnecessarily clutter the initial interface. 9197 </li> 9198<li class="listitem"> 9199 Work stealing thread pools, this is a specialized use case and 9200 is encapsulated in the ForkJoinPool in java, which allows lightweight 9201 work to be created by tasks in the pool and either run by the 9202 same thread for invocation efficiency or stolen by another thread 9203 without additional work. These have been left out until there 9204 is a more concrete fork-join proposal or until there is a more 9205 clear need as these can be complicated to implement 9206 </li> 9207</ol></div> 9208 </li> 9209<li class="listitem"> 9210 Mutual exclusion executors 9211 <div class="orderedlist"><ol class="orderedlist" type="a"> 9212<li class="listitem"> 9213 Serial executors, which guarantee all work to be executed such 9214 that no two works will execute concurrently. This allows for 9215 a sequence of operations to be queued in sequence and that sequential 9216 order is maintained and work can be queued on a separate thread 9217 but with no mutual exclusion required. 9218 </li> 9219<li class="listitem"> 9220 Loop executor, in which one thread donates itself to the executor 9221 to execute all queued work. This is related to the serial executor 9222 in that it guarantees mutual exclusion, but instead guarantees 9223 a particular thread will execute the work. These are particularly 9224 useful for testing purposes where code assumes an executor but 9225 testing code desires control over execution. 9226 </li> 9227<li class="listitem"> 9228 GUI thread executor, where a GUI framework can expose an executor 9229 interface to allow other threads to queue up work to be executed 9230 as part of the GUI thread. This behaves similarly to a loop executor, 9231 but must be implemented as a custom interface as part of the 9232 framework. 9233 </li> 9234</ol></div> 9235 </li> 9236<li class="listitem"> 9237 Inline executors, which execute inline to the thread which calls submit(). 9238 This has no queuing and behaves like a normal executor, but always 9239 uses the caller’s thread to execute. This allows parallel execution 9240 of works, though. This type of executor is often useful when there 9241 is an executor required by an interface, but when for performance reasons 9242 it’s better not to queue work or switch threads. This is often very 9243 useful as an optimization for work continuations which should execute 9244 immediately or quickly and can also be useful for optimizations when 9245 an interface requires an executor but the work tasks are too small 9246 to justify the overhead of a full thread pool. 9247 </li> 9248</ol></div> 9249<p> 9250 A question arises of which of these executors (or others) be included in 9251 this library. There are use cases for these and many other executors. Often 9252 it is useful to have more than one implemented executor (e.g. the thread 9253 pool) to have more precise control of where the work is executed due to 9254 the existence of a GUI thread, or for testing purposes. A few core executors 9255 are frequently useful and these have been outlined here as the core of 9256 what should be in this library, if common use cases arise for alternative 9257 executor implementations, they can be added in the future. The current 9258 set provided here are: a basic thread pool <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code>, 9259 a serial executor <code class="computeroutput"><span class="identifier">serial_executor</span></code>, 9260 a loop executor <code class="computeroutput"><span class="identifier">loop_executor</span></code>, 9261 an inline executor <code class="computeroutput"><span class="identifier">inline_executor</span></code> 9262 and a thread-spawning executor <code class="computeroutput"><span class="identifier">thread_executor</span></code>. 9263 </p> 9264</div> 9265<div class="section"> 9266<div class="titlepage"><div><div><h4 class="title"> 9267<a name="thread.synchronization.executors.examples"></a><a class="link" href="synchronization.html#thread.synchronization.executors.examples" title="Examples">Examples</a> 9268</h4></div></div></div> 9269<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.examples.quick_sort">Parallel 9270 Quick Sort</a></span></dt></dl></div> 9271<div class="section"> 9272<div class="titlepage"><div><div><h5 class="title"> 9273<a name="thread.synchronization.executors.examples.quick_sort"></a><a class="link" href="synchronization.html#thread.synchronization.executors.examples.quick_sort" title="Parallel Quick Sort">Parallel 9274 Quick Sort</a> 9275</h5></div></div></div> 9276<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">executors</span><span class="special">/</span><span class="identifier">basic_thread_pool</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 9277<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">future</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 9278<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">numeric</span><span class="special">></span> 9279<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 9280<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">functional</span><span class="special">></span> 9281<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 9282<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">list</span><span class="special">></span> 9283 9284<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 9285<span class="keyword">struct</span> <span class="identifier">sorter</span> 9286<span class="special">{</span> 9287 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">;</span> 9288 <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">return_type</span><span class="special">;</span> 9289 9290 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">do_sort</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">chunk_data</span><span class="special">)</span> 9291 <span class="special">{</span> 9292 <span class="keyword">if</span><span class="special">(</span><span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span> 9293 <span class="keyword">return</span> <span class="identifier">chunk_data</span><span class="special">;</span> 9294 <span class="special">}</span> 9295 9296 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">result</span><span class="special">;</span> 9297 <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">chunk_data</span><span class="special">,</span> <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span> 9298 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">partition_val</span><span class="special">=*</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> 9299 9300 <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">divide_point</span> <span class="special">=</span> 9301 <span class="identifier">std</span><span class="special">::</span><span class="identifier">partition</span><span class="special">(</span><span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> 9302 <span class="special">[&](</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">val</span><span class="special">){</span><span class="keyword">return</span> <span class="identifier">val</span><span class="special"><</span><span class="identifier">partition_val</span><span class="special">;});</span> 9303 9304 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">new_lower_chunk</span><span class="special">;</span> 9305 <span class="identifier">new_lower_chunk</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">new_lower_chunk</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">chunk_data</span><span class="special">,</span> 9306 <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">divide_point</span><span class="special">);</span> 9307 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> <span class="identifier">new_lower</span> <span class="special">=</span> 9308 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span><span class="special">(</span><span class="identifier">pool</span><span class="special">,</span> <span class="special">&</span><span class="identifier">sorter</span><span class="special">::</span><span class="identifier">do_sort</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">new_lower_chunk</span><span class="special">));</span> 9309 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">new_higher</span><span class="special">(</span><span class="identifier">do_sort</span><span class="special">(</span><span class="identifier">chunk_data</span><span class="special">));</span> 9310 <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span><span class="identifier">new_higher</span><span class="special">);</span> 9311 <span class="keyword">while</span><span class="special">(!</span><span class="identifier">new_lower</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">())</span> <span class="special">{</span> 9312 <span class="identifier">pool</span><span class="special">.</span><span class="identifier">schedule_one_or_yield</span><span class="special">();</span> 9313 <span class="special">}</span> 9314 <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">new_lower</span><span class="special">.</span><span class="identifier">get</span><span class="special">());</span> 9315 <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span> 9316 <span class="special">}</span> 9317<span class="special">};</span> 9318 9319<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 9320<span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">parallel_quick_sort</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">input</span><span class="special">)</span> <span class="special">{</span> 9321 <span class="keyword">if</span><span class="special">(</span><span class="identifier">input</span><span class="special">.</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span> 9322 <span class="keyword">return</span> <span class="identifier">input</span><span class="special">;</span> 9323 <span class="special">}</span> 9324 <span class="identifier">sorter</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">s</span><span class="special">;</span> 9325 <span class="keyword">return</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">do_sort</span><span class="special">(</span><span class="identifier">input</span><span class="special">);</span> 9326<span class="special">}</span> 9327</pre> 9328</div> 9329</div> 9330<div class="section"> 9331<div class="titlepage"><div><div><h4 class="title"> 9332<a name="thread.synchronization.executors.rationale"></a><a class="link" href="synchronization.html#thread.synchronization.executors.rationale" title="Design Rationale">Design 9333 Rationale</a> 9334</h4></div></div></div> 9335<p> 9336 The authors of Boost.Thread have taken a different approach respect to 9337 N3785. Instead of basing all the design on an abstract executor class we 9338 make executor concepts. We believe that this is the good direction as a 9339 static polymorphic executor can be seen as a dynamic polymorphic executor 9340 using a simple adaptor. We believe also that it would make the library 9341 more usable, and more convenient for users. 9342 </p> 9343<p> 9344 The major design decisions concern deciding what a unit of work is, how 9345 to manage with units of work and time related functions in a polymorphic 9346 way. 9347 </p> 9348<p> 9349 An Executor is an object that schedules the closures that have been submitted 9350 to it, usually asynchronously. There could be multiple models of the Executor 9351 class. Some specific design notes: 9352 </p> 9353<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 9354<li class="listitem"> 9355 Thread pools are well know models of the Executor concept, and this 9356 library does indeed include a basic_thread_pool class, but other implementations 9357 also exist, including the ability to schedule work on GUI threads, 9358 scheduling work on a donor thread, as well as several specializations 9359 of thread pools. 9360 </li> 9361<li class="listitem"> 9362 The choice of which executor to use is explicit. This is important 9363 for reasons described in the Motivation section. In particular, consider 9364 the common case of an asynchronous operation that itself spawns asynchronous 9365 operations. If both operations ran on the same executor, and if that 9366 executor had a bounded number of worker threads, then we could get 9367 deadlock. Programs often deal with such issues by splitting different 9368 kinds of work between different executors. 9369 </li> 9370<li class="listitem"> 9371 Even if there could be a strong value in having a default executor, 9372 that can be used when detailed control is unnecessary, the authors 9373 don't know how to implement it in a portable and robust way. 9374 </li> 9375<li class="listitem"> 9376 The library provides Executors based on static and dynamic polymorphism. 9377 The static polymorphism interface is intended to be used on contexts 9378 that need to have the best performances. The dynamic polymorphism interface 9379 has the advantage to been able to change the executor a function is 9380 using without making it a template and is possible to pass executors 9381 across a binary interface. For some applications, the cost of an additional 9382 virtual dispatch could be almost certainly negligible compared to the 9383 other operations involved. 9384 </li> 9385<li class="listitem"> 9386 Conceptually, an executor puts closures on a queue and at some point 9387 executes them. The queue is always unbounded, so adding a closure to 9388 an executor never blocks. (Defining “never blocks” formally is 9389 challenging, but informally we just mean that submit() is an ordinary 9390 function that executes something and returns, rather than waiting for 9391 the completion of some potentially long running operation in another 9392 thread.) 9393 </li> 9394</ul></div> 9395<h6> 9396<a name="thread.synchronization.executors.rationale.h0"></a> 9397 <span class="phrase"><a name="thread.synchronization.executors.rationale.closure"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.closure">Closure</a> 9398 </h6> 9399<p> 9400 One important question is just what a closure is. This library has a very 9401 simple answer: a closure is a <code class="computeroutput"><span class="identifier">Callable</span></code> 9402 with no parameters and returning <code class="computeroutput"><span class="keyword">void</span></code>. 9403 </p> 9404<p> 9405 N3785 choose the more specific <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span></code> as it provides only dynamic polymorphism 9406 and states that in practice the implementation of a template based approach 9407 or another approach is impractical. The authors of this library think that 9408 the template based approach is compatible with a dynamic based approach. 9409 They give some arguments: 9410 </p> 9411<p> 9412 The first one is that a virtual function can not be a template. This is 9413 true but it is also true that the executor interface can provide the template 9414 functions that call to the virtual public functions. Another reason they 9415 give is that "a template parameter would complicate the interface 9416 without adding any real generality. In the end an executor class is going 9417 to need some kind of type erasure to handle all the different kinds of 9418 function objects with <code class="computeroutput"><span class="keyword">void</span><span class="special">()</span></code> signature, and that’s exactly what 9419 std::function already does". We think that it is up to the executor 9420 to manage with this implementation details, not to the user. 9421 </p> 9422<p> 9423 We share all the argument they give related to the <code class="computeroutput"><span class="keyword">void</span><span class="special">()</span></code> interface of the work unit. A work unit 9424 is a closure that takes no arguments and returns no value. This is indeed 9425 a limitation on user code, but combined with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> 9426 taking executors as parameters the user has all what she needs. 9427 </p> 9428<p> 9429 The third one is related to performance. They assert that "any mechanism 9430 for storing closures on an executor’s queue will have to use some form 9431 of type erasure. There’s no reason to believe that a custom closure mechanism, 9432 written just for std::executor and used nowhere else within the standard 9433 library, would be better in that respect than <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span></code>". We believe that the implementation 9434 can do better that storing the closure on a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span></code>. e.g. the implementation can use 9435 intrusive data to store the closure and the pointers to other nodes needed 9436 to store the closures in a given order. 9437 </p> 9438<p> 9439 In addition <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span></code> 9440 can not be constructed by moving the closure, so e.g. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">packaged_task</span></code> 9441 could not be a Closure. 9442 </p> 9443<h6> 9444<a name="thread.synchronization.executors.rationale.h1"></a> 9445 <span class="phrase"><a name="thread.synchronization.executors.rationale.scheduled_work"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.scheduled_work">Scheduled 9446 work</a> 9447 </h6> 9448<p> 9449 The approach of this library respect to scheduled work of the N3785 proposal 9450 is quite different. Instead of adding the scheduled operations to a specific 9451 scheduled_executor polymorphic interface, we opt by adding a specific 9452 <code class="computeroutput"><span class="identifier">scheduler</span></code> class that is 9453 not an executor and knows how to manage with the scheduling of timed tasks 9454 <code class="computeroutput"><span class="identifier">submit_at</span></code>/<code class="computeroutput"><span class="identifier">submit_after</span></code>. 9455 </p> 9456<p> 9457 <code class="computeroutput"><span class="identifier">scheduler</span></code> provides executor 9458 factories <code class="computeroutput"><span class="identifier">at</span></code>/<code class="computeroutput"><span class="identifier">after</span></code> given a specific <code class="computeroutput"><span class="identifier">time_point</span></code> or a <code class="computeroutput"><span class="identifier">duration</span></code>. 9459 The built executors wrap a reference to this scheduler and the time at 9460 which the submitted task will be executed. 9461 </p> 9462<p> 9463 If we want to schedule these operations on an existing executor (as <code class="computeroutput"><span class="identifier">serial_executor</span></code> does), these classes 9464 provide a <code class="computeroutput"><span class="identifier">on</span></code> factory taking 9465 another executor as parameter and wraps both instance on the returned executor. 9466 </p> 9467<pre class="programlisting"><span class="identifier">sch</span><span class="special">.</span><span class="identifier">on</span><span class="special">(</span><span class="identifier">tp</span><span class="special">).</span><span class="identifier">after</span><span class="special">(</span><span class="identifier">seconds</span><span class="special">(</span><span class="identifier">i</span><span class="special">)).</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">fn</span><span class="special">,</span><span class="identifier">i</span><span class="special">));</span> 9468</pre> 9469<p> 9470 This has several advantages: 9471 </p> 9472<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 9473<li class="listitem"> 9474 The scheduled operations are available for all the executors via wrappers. 9475 </li> 9476<li class="listitem"> 9477 The template functions could accept any chrono <code class="computeroutput"><span class="identifier">time_point</span></code> 9478 and <code class="computeroutput"><span class="identifier">duration</span></code> respectively 9479 as we are not working with virtual functions. 9480 </li> 9481</ul></div> 9482<p> 9483 In order to manage with all the clocks, this library propose generic solution. 9484 <code class="computeroutput"><span class="identifier">scheduler</span><span class="special"><</span><span class="identifier">Clock</span><span class="special">></span></code> 9485 know how to manage with the <code class="computeroutput"><span class="identifier">submit_at</span></code>/<code class="computeroutput"><span class="identifier">submit_after</span></code> <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span></code>/<code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span></code> tasks. Note that the durations 9486 on different clocks differ. 9487 </p> 9488<h6> 9489<a name="thread.synchronization.executors.rationale.h2"></a> 9490 <span class="phrase"><a name="thread.synchronization.executors.rationale.not_handled_exceptions"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.not_handled_exceptions">Not 9491 Handled Exceptions</a> 9492 </h6> 9493<p> 9494 As in N3785 and based on the same design decision than <code class="computeroutput"><span class="identifier">std</span></code>/<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> if a user closure throws an exception, 9495 the executor must call the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code> 9496 function. Note that when we combine <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> 9497 and <code class="computeroutput"><span class="identifier">Executors</span></code>, the exception 9498 will be caught by the closure associated to the returned future, so that 9499 the exception is stored on the returned future, as for the other <code class="computeroutput"><span class="identifier">async</span></code> overloads. 9500 </p> 9501<h6> 9502<a name="thread.synchronization.executors.rationale.h3"></a> 9503 <span class="phrase"><a name="thread.synchronization.executors.rationale.at_thread_entry"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.at_thread_entry">At 9504 thread entry</a> 9505 </h6> 9506<p> 9507 It is common idiom to set some thread local variable at the beginning of 9508 a thread. As Executors could instantiate threads internally these Executors 9509 shall have the ability to call a user specific function at thread entry 9510 on the executor constructor. 9511 </p> 9512<p> 9513 For executors that don't instantiate any thread and that would use the 9514 current thread this function shall be called only for the thread calling 9515 the <code class="computeroutput"><span class="identifier">at_thread_entry</span></code> member 9516 function. 9517 </p> 9518<h6> 9519<a name="thread.synchronization.executors.rationale.h4"></a> 9520 <span class="phrase"><a name="thread.synchronization.executors.rationale.cancelation"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.cancelation">Cancelation</a> 9521 </h6> 9522<p> 9523 The library does not provision yet for the ability to cancel/interrupt 9524 work, though this is a commonly requested feature. 9525 </p> 9526<p> 9527 This could be managed externally by an additional cancelation object that 9528 can be shared between the creator of the unit of work and the unit of work. 9529 </p> 9530<p> 9531 We can think also of a cancelable closure that could be used in a more 9532 transparent way. 9533 </p> 9534<p> 9535 An alternative is to make async return a cancelable_task but this will 9536 need also a cancelable closure. 9537 </p> 9538<h6> 9539<a name="thread.synchronization.executors.rationale.h5"></a> 9540 <span class="phrase"><a name="thread.synchronization.executors.rationale.current_executor"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.current_executor">Current 9541 executor</a> 9542 </h6> 9543<p> 9544 The library does not provision for the ability to get the current executor, 9545 though having access to it could simplify a lot the user code. 9546 </p> 9547<p> 9548 The reason is that the user can always use a thread_local variable and 9549 reset it using the <code class="computeroutput"><span class="identifier">at_thread_entry</span> 9550 </code> member function. 9551 </p> 9552<pre class="programlisting"><span class="keyword">thread_local</span> <span class="identifier">current_executor_state_type</span> <span class="identifier">current_executor_state</span><span class="special">;</span> 9553<span class="identifier">executor</span><span class="special">*</span> <span class="identifier">current_executor</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">current_executor_state</span><span class="special">.</span><span class="identifier">current_executor</span><span class="special">();</span> <span class="special">}</span> 9554<span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">(</span> 9555 <span class="comment">// at_thread_entry</span> 9556 <span class="special">[](</span><span class="identifier">basic_thread_pool</span><span class="special">&</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span> 9557 <span class="identifier">current_executor_state</span><span class="special">.</span><span class="identifier">set_current_executor</span><span class="special">(</span><span class="identifier">pool</span><span class="special">);</span> 9558 <span class="special">}</span> 9559<span class="special">);</span> 9560</pre> 9561<p> 9562 [ 9563 </p> 9564<h6> 9565<a name="thread.synchronization.executors.rationale.h6"></a> 9566 <span class="phrase"><a name="thread.synchronization.executors.rationale.default_executor"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.default_executor">Default 9567 executor</a> 9568 </h6> 9569<p> 9570 The library authors share some of the concerns of the C++ standard committee 9571 (introduction of a new single shared resource, a singleton, could make 9572 it difficult to make it portable to all the environments) and that this 9573 library doesn't need to provide a default executor for the time been. 9574 </p> 9575<p> 9576 The user can always define his default executor himself. 9577 </p> 9578<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">generic_executor_ref</span> <span class="identifier">default_executor</span><span class="special">()</span> 9579<span class="special">{</span> 9580 <span class="keyword">static</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">basic_thread_pool</span> <span class="identifier">tp</span><span class="special">(</span><span class="number">4</span><span class="special">);</span> 9581 <span class="keyword">return</span> <span class="identifier">generic_executor_ref</span><span class="special">(</span><span class="identifier">tp</span><span class="special">);</span> 9582<span class="special">}</span> 9583</pre> 9584</div> 9585<div class="section"> 9586<div class="titlepage"><div><div><h4 class="title"> 9587<a name="thread.synchronization.executors.ref"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref" title="Reference">Reference</a> 9588</h4></div></div></div> 9589<div class="toc"><dl class="toc"> 9590<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.concept_closure">Concept 9591 <code class="computeroutput"><span class="identifier">Closure</span></code></a></span></dt> 9592<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.concept_executor">Concept 9593 <code class="computeroutput"><span class="identifier">Executor</span></code></a></span></dt> 9594<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.work">Class 9595 <code class="computeroutput"><span class="identifier">work</span></code></a></span></dt> 9596<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.executor">Class 9597 <code class="computeroutput"><span class="identifier">executor</span></code></a></span></dt> 9598<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor">Template 9599 Class <code class="computeroutput"><span class="identifier">executor_adaptor</span></code></a></span></dt> 9600<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.generic_executor_ref">Class 9601 <code class="computeroutput"><span class="identifier">generic_executor_ref</span></code></a></span></dt> 9602<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.scheduler">Template 9603 Class <code class="computeroutput"><span class="identifier">scheduler</span> </code></a></span></dt> 9604<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.at_executor">Template 9605 Class <code class="computeroutput"><span class="identifier">at_executor</span></code></a></span></dt> 9606<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper">Template 9607 Class <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span></code></a></span></dt> 9608<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor">Template 9609 Class <code class="computeroutput"><span class="identifier">resubmit_at_executor</span></code></a></span></dt> 9610<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.serial_executor">Template 9611 Class <code class="computeroutput"><span class="identifier">serial_executor</span></code></a></span></dt> 9612<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.inline_executor">Class 9613 <code class="computeroutput"><span class="identifier">inline_executor</span></code></a></span></dt> 9614<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool">Class 9615 <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code></a></span></dt> 9616<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.thread_executor">Class 9617 <code class="computeroutput"><span class="identifier">thread_executor</span></code></a></span></dt> 9618<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.loop_executor">Class 9619 <code class="computeroutput"><span class="identifier">loop_executor</span></code></a></span></dt> 9620</dl></div> 9621<div class="section"> 9622<div class="titlepage"><div><div><h5 class="title"> 9623<a name="thread.synchronization.executors.ref.concept_closure"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_closure" title="Concept Closure">Concept 9624 <code class="computeroutput"><span class="identifier">Closure</span></code></a> 9625</h5></div></div></div> 9626<p> 9627 A type <code class="computeroutput"><span class="identifier">E</span></code> meets the <code class="computeroutput"><span class="identifier">Closure</span></code> requirements if is a model 9628 of <code class="computeroutput"><span class="identifier">Callable</span><span class="special">(</span><span class="keyword">void</span><span class="special">())</span></code> 9629 and a model of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>/<code class="computeroutput"><span class="identifier">MoveConstructible</span></code>. 9630 </p> 9631</div> 9632<div class="section"> 9633<div class="titlepage"><div><div><h5 class="title"> 9634<a name="thread.synchronization.executors.ref.concept_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor" title="Concept Executor">Concept 9635 <code class="computeroutput"><span class="identifier">Executor</span></code></a> 9636</h5></div></div></div> 9637<p> 9638 The <code class="computeroutput"><span class="identifier">Executor</span></code> concept 9639 models the common operations of all the executors. 9640 </p> 9641<p> 9642 A type <code class="computeroutput"><span class="identifier">E</span></code> meets the <code class="computeroutput"><span class="identifier">Executor</span></code> requirements if the following 9643 expressions are well-formed and have the specified semantics 9644 </p> 9645<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 9646<li class="listitem"> 9647 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">lc</span><span class="special">);</span></code> 9648 </li> 9649<li class="listitem"> 9650 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">rc</span><span class="special">);</span></code> 9651 </li> 9652<li class="listitem"> 9653 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code> 9654 </li> 9655<li class="listitem"> 9656 <code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> 9657 <span class="identifier">e</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code> 9658 </li> 9659<li class="listitem"> 9660 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">try_executing_one</span><span class="special">();</span></code> 9661 </li> 9662<li class="listitem"> 9663 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code> 9664 </li> 9665</ul></div> 9666<p> 9667 where 9668 </p> 9669<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 9670<li class="listitem"> 9671 <code class="computeroutput"><span class="identifier">e</span></code> denotes a value 9672 of type <code class="computeroutput"><span class="identifier">E</span></code>, 9673 </li> 9674<li class="listitem"> 9675 <code class="computeroutput"><span class="identifier">lc</span></code> denotes a lvalue 9676 reference of type <code class="computeroutput"><span class="identifier">Closure</span></code>, 9677 </li> 9678<li class="listitem"> 9679 <code class="computeroutput"><span class="identifier">rc</span></code> denotes a rvalue 9680 reference of type <code class="computeroutput"><span class="identifier">Closure</span></code> 9681 </li> 9682<li class="listitem"> 9683 <code class="computeroutput"><span class="identifier">p</span></code> denotes a value 9684 of type <code class="computeroutput"><span class="identifier">Predicate</span></code> 9685 </li> 9686</ul></div> 9687<div class="section"> 9688<div class="titlepage"><div><div><h6 class="title"> 9689<a name="thread.synchronization.executors.ref.concept_executor.submitlc"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.submitlc" title="e.submit(lc);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">lc</span><span class="special">);</span></code></a> 9690</h6></div></div></div> 9691<div class="variablelist"> 9692<p class="title"><b></b></p> 9693<dl class="variablelist"> 9694<dt><span class="term">Effects:</span></dt> 9695<dd><p> 9696 The specified closure will be scheduled for execution at some 9697 point in the future. If invoked closure throws an exception the 9698 executor will call std::terminate, as is the case with threads. 9699 </p></dd> 9700<dt><span class="term">Synchronization:</span></dt> 9701<dd><p> 9702 completion of closure on a particular thread happens before destruction 9703 of thread's thread local variables. 9704 </p></dd> 9705<dt><span class="term">Return type:</span></dt> 9706<dd><p> 9707 <code class="computeroutput"><span class="keyword">void</span></code>. 9708 </p></dd> 9709<dt><span class="term">Throws:</span></dt> 9710<dd><p> 9711 sync_queue_is_closed if the thread pool is closed. Whatever exception 9712 that can be throw while storing the closure. 9713 </p></dd> 9714<dt><span class="term">Exception safety:</span></dt> 9715<dd><p> 9716 If an exception is thrown then the executor state is unmodified. 9717 </p></dd> 9718</dl> 9719</div> 9720</div> 9721<div class="section"> 9722<div class="titlepage"><div><div><h6 class="title"> 9723<a name="thread.synchronization.executors.ref.concept_executor.submitrc"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.submitrc" title="e.submit(rc);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">rc</span><span class="special">);</span></code></a> 9724</h6></div></div></div> 9725<div class="variablelist"> 9726<p class="title"><b></b></p> 9727<dl class="variablelist"> 9728<dt><span class="term">Effects:</span></dt> 9729<dd><p> 9730 The specified closure will be scheduled for execution at some 9731 point in the future. If invoked closure throws an exception the 9732 executor will call std::terminate, as is the case with threads. 9733 </p></dd> 9734<dt><span class="term">Synchronization:</span></dt> 9735<dd><p> 9736 completion of closure on a particular thread happens before destruction 9737 of thread's thread local variables. 9738 </p></dd> 9739<dt><span class="term">Return type:</span></dt> 9740<dd><p> 9741 <code class="computeroutput"><span class="keyword">void</span></code>. 9742 </p></dd> 9743<dt><span class="term">Throws:</span></dt> 9744<dd><p> 9745 sync_queue_is_closed if the thread pool is closed. Whatever exception 9746 that can be throw while storing the closure. 9747 </p></dd> 9748<dt><span class="term">Exception safety:</span></dt> 9749<dd><p> 9750 If an exception is thrown then the executor state is unmodified. 9751 </p></dd> 9752</dl> 9753</div> 9754</div> 9755<div class="section"> 9756<div class="titlepage"><div><div><h6 class="title"> 9757<a name="thread.synchronization.executors.ref.concept_executor.close"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.close" title="e.close();"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code></a> 9758</h6></div></div></div> 9759<div class="variablelist"> 9760<p class="title"><b></b></p> 9761<dl class="variablelist"> 9762<dt><span class="term">Effects:</span></dt> 9763<dd><p> 9764 close the executor <code class="computeroutput"><span class="identifier">e</span></code> 9765 for submissions. 9766 </p></dd> 9767<dt><span class="term">Remark:</span></dt> 9768<dd><p> 9769 The worker threads will work until there is no more closures 9770 to run. 9771 </p></dd> 9772<dt><span class="term">Return type:</span></dt> 9773<dd><p> 9774 <code class="computeroutput"><span class="keyword">void</span></code>. 9775 </p></dd> 9776<dt><span class="term">Throws:</span></dt> 9777<dd><p> 9778 Whatever exception that can be thrown while ensuring the thread 9779 safety. 9780 </p></dd> 9781<dt><span class="term">Exception safety:</span></dt> 9782<dd><p> 9783 If an exception is thrown then the executor state is unmodified. 9784 </p></dd> 9785</dl> 9786</div> 9787</div> 9788<div class="section"> 9789<div class="titlepage"><div><div><h6 class="title"> 9790<a name="thread.synchronization.executors.ref.concept_executor.closed"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.closed" title="b = e.closed();"><code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code></a> 9791</h6></div></div></div> 9792<div class="variablelist"> 9793<p class="title"><b></b></p> 9794<dl class="variablelist"> 9795<dt><span class="term">Return type:</span></dt> 9796<dd><p> 9797 <code class="computeroutput"><span class="keyword">bool</span></code>. 9798 </p></dd> 9799<dt><span class="term">Return:</span></dt> 9800<dd><p> 9801 whether the executor is closed for submissions. 9802 </p></dd> 9803<dt><span class="term">Throws:</span></dt> 9804<dd><p> 9805 Whatever exception that can be throw while ensuring the thread 9806 safety. 9807 </p></dd> 9808</dl> 9809</div> 9810</div> 9811<div class="section"> 9812<div class="titlepage"><div><div><h6 class="title"> 9813<a name="thread.synchronization.executors.ref.concept_executor.try_executing_one"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.try_executing_one" title="e.try_executing_one();"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">try_executing_one</span><span class="special">();</span></code></a> 9814</h6></div></div></div> 9815<div class="variablelist"> 9816<p class="title"><b></b></p> 9817<dl class="variablelist"> 9818<dt><span class="term">Effects:</span></dt> 9819<dd><p> 9820 try to execute one work. 9821 </p></dd> 9822<dt><span class="term">Remark:</span></dt> 9823<dd><p> 9824 whether a work has been executed. 9825 </p></dd> 9826<dt><span class="term">Return type:</span></dt> 9827<dd><p> 9828 <code class="computeroutput"><span class="keyword">bool</span></code>. 9829 </p></dd> 9830<dt><span class="term">Return:</span></dt> 9831<dd><p> 9832 Whether a work has been executed. 9833 </p></dd> 9834<dt><span class="term">Throws:</span></dt> 9835<dd><p> 9836 whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code> 9837 throws. 9838 </p></dd> 9839</dl> 9840</div> 9841</div> 9842<div class="section"> 9843<div class="titlepage"><div><div><h6 class="title"> 9844<a name="thread.synchronization.executors.ref.concept_executor.reschedule_until"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.reschedule_until" title="e.reschedule_until(p);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code></a> 9845</h6></div></div></div> 9846<div class="variablelist"> 9847<p class="title"><b></b></p> 9848<dl class="variablelist"> 9849<dt><span class="term">Requires:</span></dt> 9850<dd><p> 9851 This must be called from a scheduled work 9852 </p></dd> 9853<dt><span class="term">Effects:</span></dt> 9854<dd><p> 9855 reschedule works until <code class="computeroutput"><span class="identifier">p</span><span class="special">()</span></code>. 9856 </p></dd> 9857<dt><span class="term">Return type:</span></dt> 9858<dd><p> 9859 <code class="computeroutput"><span class="keyword">bool</span></code>. 9860 </p></dd> 9861<dt><span class="term">Return:</span></dt> 9862<dd><p> 9863 Whether a work has been executed. 9864 </p></dd> 9865<dt><span class="term">Throws:</span></dt> 9866<dd><p> 9867 whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code> 9868 throws. 9869 </p></dd> 9870</dl> 9871</div> 9872</div> 9873</div> 9874<div class="section"> 9875<div class="titlepage"><div><div><h5 class="title"> 9876<a name="thread.synchronization.executors.ref.work"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.work" title="Class work">Class 9877 <code class="computeroutput"><span class="identifier">work</span></code></a> 9878</h5></div></div></div> 9879<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">executors</span><span class="special">/</span><span class="identifier">work</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 9880<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 9881 <span class="keyword">typedef</span> <span class="char">'implementation_defined'</span> <span class="identifier">work</span><span class="special">;</span> 9882<span class="special">}</span> 9883</pre> 9884<div class="variablelist"> 9885<p class="title"><b></b></p> 9886<dl class="variablelist"> 9887<dt><span class="term">Requires:</span></dt> 9888<dd><p> 9889 work is a model of 'Closure' 9890 </p></dd> 9891</dl> 9892</div> 9893</div> 9894<div class="section"> 9895<div class="titlepage"><div><div><h5 class="title"> 9896<a name="thread.synchronization.executors.ref.executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor" title="Class executor">Class 9897 <code class="computeroutput"><span class="identifier">executor</span></code></a> 9898</h5></div></div></div> 9899<p> 9900 Executor abstract base class. 9901 </p> 9902<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">executors</span><span class="special">/</span><span class="identifier">executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 9903<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 9904 <span class="keyword">class</span> <span class="identifier">executor</span> 9905 <span class="special">{</span> 9906 <span class="keyword">public</span><span class="special">:</span> 9907 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">work</span> <span class="identifier">work</span><span class="special">;</span> 9908 9909 <span class="identifier">executor</span><span class="special">(</span><span class="identifier">executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 9910 <span class="identifier">executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 9911 9912 <span class="identifier">executor</span><span class="special">();</span> 9913 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor</span><span class="special">()</span> <span class="special">{};</span> 9914 9915 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 9916 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 9917 9918 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 9919 <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&</span> <span class="identifier">closure</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 9920 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 9921 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 9922 9923 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 9924 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span> 9925 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span> 9926 <span class="special">};</span> 9927<span class="special">}</span> 9928</pre> 9929<div class="section"> 9930<div class="titlepage"><div><div><h6 class="title"> 9931<a name="thread.synchronization.executors.ref.executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor.constructor" title="Constructor executor()">Constructor 9932 <code class="computeroutput"><span class="identifier">executor</span><span class="special">()</span></code></a> 9933</h6></div></div></div> 9934<pre class="programlisting"><span class="identifier">executor</span><span class="special">();</span> 9935</pre> 9936<div class="variablelist"> 9937<p class="title"><b></b></p> 9938<dl class="variablelist"> 9939<dt><span class="term">Effects:</span></dt> 9940<dd><p> 9941 Constructs an executor. 9942 </p></dd> 9943<dt><span class="term">Throws:</span></dt> 9944<dd><p> 9945 Nothing. 9946 </p></dd> 9947</dl> 9948</div> 9949</div> 9950<div class="section"> 9951<div class="titlepage"><div><div><h6 class="title"> 9952<a name="thread.synchronization.executors.ref.executor.constructor0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor.constructor0" title="Destructor ~executor()">Destructor 9953 <code class="computeroutput"><span class="special">~</span><span class="identifier">executor</span><span class="special">()</span></code></a> 9954</h6></div></div></div> 9955<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor</span><span class="special">();</span> 9956</pre> 9957<div class="variablelist"> 9958<p class="title"><b></b></p> 9959<dl class="variablelist"> 9960<dt><span class="term">Effects:</span></dt> 9961<dd><p> 9962 Destroys the executor. 9963 </p></dd> 9964<dt><span class="term">Synchronization:</span></dt> 9965<dd><p> 9966 The completion of all the closures happen before the completion 9967 of the executor destructor. 9968 </p></dd> 9969</dl> 9970</div> 9971</div> 9972</div> 9973<div class="section"> 9974<div class="titlepage"><div><div><h5 class="title"> 9975<a name="thread.synchronization.executors.ref.executor_adaptor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor" title="Template Class executor_adaptor">Template 9976 Class <code class="computeroutput"><span class="identifier">executor_adaptor</span></code></a> 9977</h5></div></div></div> 9978<p> 9979 Polymorphic adaptor of a model of Executor to an executor. 9980 </p> 9981<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">executors</span><span class="special">/</span><span class="identifier">executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 9982<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 9983 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Executor</span><span class="special">></span> 9984 <span class="keyword">class</span> <span class="identifier">executor_adaptor</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">executor</span> 9985 <span class="special">{</span> 9986 <span class="identifier">Executor</span> <span class="identifier">ex</span><span class="special">;</span> <span class="comment">// for exposition only</span> 9987 <span class="keyword">public</span><span class="special">:</span> 9988 <span class="keyword">typedef</span> <span class="identifier">executor</span><span class="special">::</span><span class="identifier">work</span> <span class="identifier">work</span><span class="special">;</span> 9989 9990 <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">executor_adaptor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 9991 <span class="identifier">executor_adaptor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor_adaptor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 9992 9993 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">></span> 9994 <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span> 9995 9996 <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 9997 9998 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 9999 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 10000 10001 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10002 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&</span> <span class="identifier">closure</span><span class="special">);</span> 10003 10004 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span> 10005 10006 <span class="special">};</span> 10007<span class="special">}</span> 10008</pre> 10009<div class="section"> 10010<div class="titlepage"><div><div><h6 class="title"> 10011<a name="thread.synchronization.executors.ref.executor_adaptor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.constructor" title="Constructor executor_adaptor(Args&& ...)">Constructor 10012 <code class="computeroutput"><span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&&</span> 10013 <span class="special">...)</span></code></a> 10014</h6></div></div></div> 10015<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">></span> 10016<span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span> 10017</pre> 10018<div class="variablelist"> 10019<p class="title"><b></b></p> 10020<dl class="variablelist"> 10021<dt><span class="term">Effects:</span></dt> 10022<dd><p> 10023 Constructs an executor_adaptor. 10024 </p></dd> 10025<dt><span class="term">Throws:</span></dt> 10026<dd><p> 10027 Nothing. 10028 </p></dd> 10029</dl> 10030</div> 10031</div> 10032<div class="section"> 10033<div class="titlepage"><div><div><h6 class="title"> 10034<a name="thread.synchronization.executors.ref.executor_adaptor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.destructor" title="Destructor ~executor_adaptor()">Destructor 10035 <code class="computeroutput"><span class="special">~</span><span class="identifier">executor_adaptor</span><span class="special">()</span></code></a> 10036</h6></div></div></div> 10037<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor_adaptor</span><span class="special">();</span> 10038</pre> 10039<div class="variablelist"> 10040<p class="title"><b></b></p> 10041<dl class="variablelist"> 10042<dt><span class="term">Effects:</span></dt> 10043<dd><p> 10044 Destroys the executor_adaptor. 10045 </p></dd> 10046<dt><span class="term">Synchronization:</span></dt> 10047<dd><p> 10048 The completion of all the closures happen before the completion 10049 of the executor destructor. 10050 </p></dd> 10051</dl> 10052</div> 10053</div> 10054<div class="section"> 10055<div class="titlepage"><div><div><h6 class="title"> 10056<a name="thread.synchronization.executors.ref.executor_adaptor.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.underlying_executor" title="Function member underlying_executor()">Function 10057 member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a> 10058</h6></div></div></div> 10059<pre class="programlisting"><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 10060</pre> 10061<div class="variablelist"> 10062<p class="title"><b></b></p> 10063<dl class="variablelist"> 10064<dt><span class="term">Return:</span></dt> 10065<dd><p> 10066 The underlying executor instance. 10067 </p></dd> 10068</dl> 10069</div> 10070</div> 10071</div> 10072<div class="section"> 10073<div class="titlepage"><div><div><h5 class="title"> 10074<a name="thread.synchronization.executors.ref.generic_executor_ref"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.generic_executor_ref" title="Class generic_executor_ref">Class 10075 <code class="computeroutput"><span class="identifier">generic_executor_ref</span></code></a> 10076</h5></div></div></div> 10077<p> 10078 Executor abstract base class. 10079 </p> 10080<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">executors</span><span class="special">/</span><span class="identifier">generic_executor_ref</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 10081<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 10082 <span class="keyword">class</span> <span class="identifier">generic_executor_ref</span> 10083 <span class="special">{</span> 10084 <span class="keyword">public</span><span class="special">:</span> 10085 <span class="identifier">generic_executor_ref</span><span class="special">(</span><span class="identifier">generic_executor_ref</span> <span class="keyword">const</span><span class="special">&);</span> 10086 <span class="identifier">generic_executor_ref</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">generic_executor_ref</span> <span class="keyword">const</span><span class="special">&);</span> 10087 10088 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span> 10089 <span class="identifier">generic_executor_ref</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span> 10090 <span class="identifier">generic_executor_ref</span><span class="special">()</span> <span class="special">{};</span> 10091 10092 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 10093 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 10094 10095 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10096 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10097 10098 <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 10099 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span> 10100 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span> 10101 <span class="special">};</span> 10102<span class="special">}</span> 10103</pre> 10104</div> 10105<div class="section"> 10106<div class="titlepage"><div><div><h5 class="title"> 10107<a name="thread.synchronization.executors.ref.scheduler"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler" title="Template Class scheduler">Template 10108 Class <code class="computeroutput"><span class="identifier">scheduler</span> </code></a> 10109</h5></div></div></div> 10110<p> 10111 Scheduler providing time related functions. Note that <code class="computeroutput"><span class="identifier">scheduler</span></code> 10112 is not an Executor. 10113 </p> 10114<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">executors</span><span class="special">/</span><span class="identifier">scheduler</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 10115<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 10116 10117 <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="identifier">steady_clock</span><span class="special">></span> 10118 <span class="keyword">class</span> <span class="identifier">scheduler</span> 10119 <span class="special">{</span> 10120 <span class="keyword">public</span><span class="special">:</span> 10121 <span class="keyword">using</span> <span class="identifier">work</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">void</span><span class="special">()></span> <span class="special">;</span> 10122 <span class="keyword">using</span> <span class="identifier">clock</span> <span class="special">=</span> <span class="identifier">Clock</span><span class="special">;</span> 10123 10124 <span class="identifier">scheduler</span><span class="special">(</span><span class="identifier">scheduler</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 10125 <span class="identifier">scheduler</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">scheduler</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 10126 10127 <span class="identifier">scheduler</span><span class="special">();</span> 10128 <span class="special">~</span><span class="identifier">scheduler</span><span class="special">();</span> 10129 10130 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 10131 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 10132 10133 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10134 <span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10135 <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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10136 <span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10137 10138 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> 10139 <span class="identifier">at_executor</span><span class="special"><</span><span class="identifier">scheduler</span><span class="special">></span> <span class="identifier">submit_at</span><span class="special">(</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> 10140 <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> 10141 <span class="identifier">at_executor</span><span class="special"><</span><span class="identifier">scheduler</span><span class="special">></span> <span class="identifier">submit_after</span><span class="special">(</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> 10142 10143 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span> 10144 <span class="identifier">scheduler_executor_wrapper</span><span class="special"><</span><span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">></span> <span class="identifier">on</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span> 10145 10146 <span class="special">};</span> 10147<span class="special">}</span> 10148</pre> 10149<div class="section"> 10150<div class="titlepage"><div><div><h6 class="title"> 10151<a name="thread.synchronization.executors.ref.scheduler.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler.constructor" title="Constructor scheduler()">Constructor 10152 <code class="computeroutput"><span class="identifier">scheduler</span><span class="special">()</span></code></a> 10153</h6></div></div></div> 10154<pre class="programlisting"><span class="identifier">scheduler</span><span class="special">();</span> 10155</pre> 10156<div class="variablelist"> 10157<p class="title"><b></b></p> 10158<dl class="variablelist"> 10159<dt><span class="term">Effects:</span></dt> 10160<dd><p> 10161 Constructs a <code class="computeroutput"><span class="identifier">scheduler</span></code>. 10162 </p></dd> 10163<dt><span class="term">Throws:</span></dt> 10164<dd><p> 10165 Nothing. 10166 </p></dd> 10167</dl> 10168</div> 10169</div> 10170<div class="section"> 10171<div class="titlepage"><div><div><h6 class="title"> 10172<a name="thread.synchronization.executors.ref.scheduler.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler.destructor" title="Destructor ~scheduler()">Destructor 10173 <code class="computeroutput"><span class="special">~</span><span class="identifier">scheduler</span><span class="special">()</span></code></a> 10174</h6></div></div></div> 10175<pre class="programlisting"><span class="special">~</span><span class="identifier">scheduler</span><span class="special">();</span> 10176</pre> 10177<div class="variablelist"> 10178<p class="title"><b></b></p> 10179<dl class="variablelist"> 10180<dt><span class="term">Effects:</span></dt> 10181<dd><p> 10182 Destroys the scheduler. 10183 </p></dd> 10184<dt><span class="term">Synchronization:</span></dt> 10185<dd><p> 10186 The completion of all the closures happen before the completion 10187 of the executor destructor. 10188 </p></dd> 10189</dl> 10190</div> 10191</div> 10192<div class="section"> 10193<div class="titlepage"><div><div><h6 class="title"> 10194<a name="thread.synchronization.executors.ref.scheduler.submit_at"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler.submit_at" title="Template Function Member submit_at()">Template 10195 Function Member <code class="computeroutput"><span class="identifier">submit_at</span><span class="special">()</span></code></a> 10196</h6></div></div></div> 10197<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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10198<span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10199</pre> 10200<div class="variablelist"> 10201<p class="title"><b></b></p> 10202<dl class="variablelist"> 10203<dt><span class="term">Effects:</span></dt> 10204<dd><p> 10205 Schedule a <code class="computeroutput"><span class="identifier">closure</span></code> 10206 to be executed at <code class="computeroutput"><span class="identifier">abs_time</span></code>. 10207 </p></dd> 10208<dt><span class="term">Throws:</span></dt> 10209<dd><p> 10210 Nothing. 10211 </p></dd> 10212</dl> 10213</div> 10214</div> 10215<div class="section"> 10216<div class="titlepage"><div><div><h6 class="title"> 10217<a name="thread.synchronization.executors.ref.scheduler.submit_after"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler.submit_after" title="Template Function Member submit_after()">Template 10218 Function Member <code class="computeroutput"><span class="identifier">submit_after</span><span class="special">()</span></code></a> 10219</h6></div></div></div> 10220<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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10221<span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10222</pre> 10223<div class="variablelist"> 10224<p class="title"><b></b></p> 10225<dl class="variablelist"> 10226<dt><span class="term">Effects:</span></dt> 10227<dd><p> 10228 Schedule a <code class="computeroutput"><span class="identifier">closure</span></code> 10229 to be executed after <code class="computeroutput"><span class="identifier">rel_time</span></code>. 10230 </p></dd> 10231<dt><span class="term">Throws:</span></dt> 10232<dd><p> 10233 Nothing. 10234 </p></dd> 10235</dl> 10236</div> 10237</div> 10238</div> 10239<div class="section"> 10240<div class="titlepage"><div><div><h5 class="title"> 10241<a name="thread.synchronization.executors.ref.at_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor" title="Template Class at_executor">Template 10242 Class <code class="computeroutput"><span class="identifier">at_executor</span></code></a> 10243</h5></div></div></div> 10244<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">executors</span><span class="special">/</span><span class="identifier">scheduler</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 10245<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 10246 10247 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Scheduler</span><span class="special">></span> 10248 <span class="keyword">class</span> <span class="identifier">at_executor</span> 10249 <span class="special">{</span> 10250 <span class="keyword">public</span><span class="special">:</span> 10251 <span class="keyword">using</span> <span class="identifier">work</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">work</span><span class="special">;</span> 10252 <span class="keyword">using</span> <span class="identifier">clock</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">clock</span><span class="special">;</span> 10253 10254 <span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">at_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10255 <span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">at_executor</span> <span class="special">&&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10256 <span class="identifier">at_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">at_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10257 <span class="identifier">at_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">at_executor</span> <span class="special">&&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10258 10259 <span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">tp</span><span class="special">);</span> 10260 <span class="special">~</span><span class="identifier">at_executor</span><span class="special">();</span> 10261 10262 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 10263 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 10264 10265 <span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">underlying_scheduler</span><span class="special">();</span> 10266 10267 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Closure</span><span class="special">></span> 10268 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10269 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Work</span><span class="special">></span> 10270 <span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10271 <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">typename</span> <span class="identifier">Work</span><span class="special">></span> 10272 <span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10273 10274 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span> 10275 <span class="identifier">resubmit_at_executor</span><span class="special"><</span><span class="identifier">Scheduler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">></span> <span class="identifier">on</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span> 10276 10277 <span class="special">};</span> 10278<span class="special">}</span> 10279</pre> 10280<div class="section"> 10281<div class="titlepage"><div><div><h6 class="title"> 10282<a name="thread.synchronization.executors.ref.at_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.constructor" title="Constructor at_executor(Scheduler&, clock::time_point const&)">Constructor 10283 <code class="computeroutput"><span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&,</span> 10284 <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&)</span></code></a> 10285</h6></div></div></div> 10286<pre class="programlisting"><span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">tp</span><span class="special">);</span> 10287</pre> 10288<div class="variablelist"> 10289<p class="title"><b></b></p> 10290<dl class="variablelist"> 10291<dt><span class="term">Effects:</span></dt> 10292<dd><p> 10293 Constructs a <code class="computeroutput"><span class="identifier">at_executor</span></code>. 10294 </p></dd> 10295<dt><span class="term">Throws:</span></dt> 10296<dd><p> 10297 Nothing. 10298 </p></dd> 10299</dl> 10300</div> 10301</div> 10302<div class="section"> 10303<div class="titlepage"><div><div><h6 class="title"> 10304<a name="thread.synchronization.executors.ref.at_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.destructor" title="Destructor ~at_executor()">Destructor 10305 <code class="computeroutput"><span class="special">~</span><span class="identifier">at_executor</span><span class="special">()</span></code></a> 10306</h6></div></div></div> 10307<pre class="programlisting"><span class="special">~</span><span class="identifier">at_executor</span><span class="special">();</span> 10308</pre> 10309<div class="variablelist"> 10310<p class="title"><b></b></p> 10311<dl class="variablelist"> 10312<dt><span class="term">Effects:</span></dt> 10313<dd><p> 10314 Destroys the <code class="computeroutput"><span class="identifier">at_executor</span></code>. 10315 </p></dd> 10316<dt><span class="term">Synchronization:</span></dt> 10317<dd><p> 10318 The completion of all the closures happen before the completion 10319 of the executor destructor. 10320 </p></dd> 10321</dl> 10322</div> 10323</div> 10324<div class="section"> 10325<div class="titlepage"><div><div><h6 class="title"> 10326<a name="thread.synchronization.executors.ref.at_executor.underlying_scheduler"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.underlying_scheduler" title="Function member underlying_scheduler()">Function 10327 member <code class="computeroutput"><span class="identifier">underlying_scheduler</span><span class="special">()</span></code></a> 10328</h6></div></div></div> 10329<pre class="programlisting"><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">underlying_scheduler</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 10330</pre> 10331<div class="variablelist"> 10332<p class="title"><b></b></p> 10333<dl class="variablelist"> 10334<dt><span class="term">Return:</span></dt> 10335<dd><p> 10336 The underlying scheduler instance. 10337 </p></dd> 10338</dl> 10339</div> 10340</div> 10341<div class="section"> 10342<div class="titlepage"><div><div><h6 class="title"> 10343<a name="thread.synchronization.executors.ref.at_executor.submit_at"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.submit_at" title="Template Function Member submit()">Template 10344 Function Member <code class="computeroutput"><span class="identifier">submit</span><span class="special">()</span></code></a> 10345</h6></div></div></div> 10346<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10347<span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10348</pre> 10349<div class="variablelist"> 10350<p class="title"><b></b></p> 10351<dl class="variablelist"> 10352<dt><span class="term">Effects:</span></dt> 10353<dd><p> 10354 Schedule the <code class="computeroutput"><span class="identifier">closure</span></code> 10355 to be executed at the <code class="computeroutput"><span class="identifier">abs_time</span></code> 10356 given at construction time. 10357 </p></dd> 10358<dt><span class="term">Throws:</span></dt> 10359<dd><p> 10360 Nothing. 10361 </p></dd> 10362</dl> 10363</div> 10364</div> 10365<div class="section"> 10366<div class="titlepage"><div><div><h6 class="title"> 10367<a name="thread.synchronization.executors.ref.at_executor.submit_at0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.submit_at0" title="Template Function Member submit_at()">Template 10368 Function Member <code class="computeroutput"><span class="identifier">submit_at</span><span class="special">()</span></code></a> 10369</h6></div></div></div> 10370<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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10371<span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10372</pre> 10373<div class="variablelist"> 10374<p class="title"><b></b></p> 10375<dl class="variablelist"> 10376<dt><span class="term">Effects:</span></dt> 10377<dd><p> 10378 Schedule a <code class="computeroutput"><span class="identifier">closure</span></code> 10379 to be executed at <code class="computeroutput"><span class="identifier">abs_time</span></code>. 10380 </p></dd> 10381<dt><span class="term">Throws:</span></dt> 10382<dd><p> 10383 Nothing. 10384 </p></dd> 10385</dl> 10386</div> 10387</div> 10388<div class="section"> 10389<div class="titlepage"><div><div><h6 class="title"> 10390<a name="thread.synchronization.executors.ref.at_executor.submit_after"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.submit_after" title="Template Function Member submit_after()">Template 10391 Function Member <code class="computeroutput"><span class="identifier">submit_after</span><span class="special">()</span></code></a> 10392</h6></div></div></div> 10393<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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10394<span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10395</pre> 10396<div class="variablelist"> 10397<p class="title"><b></b></p> 10398<dl class="variablelist"> 10399<dt><span class="term">Effects:</span></dt> 10400<dd><p> 10401 Schedule a <code class="computeroutput"><span class="identifier">closure</span></code> 10402 to be executed after <code class="computeroutput"><span class="identifier">rel_time</span></code>. 10403 </p></dd> 10404<dt><span class="term">Throws:</span></dt> 10405<dd><p> 10406 Nothing. 10407 </p></dd> 10408</dl> 10409</div> 10410</div> 10411</div> 10412<div class="section"> 10413<div class="titlepage"><div><div><h5 class="title"> 10414<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper" title="Template Class scheduler_executor_wrapper">Template 10415 Class <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span></code></a> 10416</h5></div></div></div> 10417<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">executors</span><span class="special">/</span><span class="identifier">scheduler</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 10418<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 10419 10420 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Scheduler</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span> 10421 <span class="keyword">class</span> <span class="identifier">scheduler_executor_wrapper</span> 10422 <span class="special">{</span> 10423 <span class="keyword">public</span><span class="special">:</span> 10424 <span class="keyword">using</span> <span class="identifier">work</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">work</span><span class="special">;</span> 10425 <span class="keyword">using</span> <span class="identifier">clock</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">clock</span><span class="special">;</span> 10426 10427 <span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">scheduler_executor_wrapper</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10428 <span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">scheduler_executor_wrapper</span> <span class="special">&&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10429 <span class="identifier">scheduler_executor_wrapper</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">scheduler_executor_wrapper</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10430 <span class="identifier">scheduler_executor_wrapper</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">scheduler_executor_wrapper</span> <span class="special">&&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10431 10432 <span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span> 10433 10434 <span class="special">~</span><span class="identifier">scheduler_executor_wrapper</span><span class="special">();</span> 10435 10436 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 10437 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 10438 10439 <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">();</span> 10440 <span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">underlying_scheduler</span><span class="special">();</span> 10441 10442 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Closure</span><span class="special">></span> 10443 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10444 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Work</span><span class="special">></span> 10445 <span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10446 <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">typename</span> <span class="identifier">Work</span><span class="special">></span> 10447 <span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10448 10449 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> 10450 <span class="identifier">resubmit_at_executor</span><span class="special"><</span><span class="identifier">Scheduler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">></span> <span class="identifier">at</span><span class="special">(</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> 10451 <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> 10452 <span class="identifier">resubmit_at_executor</span><span class="special"><</span><span class="identifier">Scheduler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">></span> <span class="identifier">after</span><span class="special">(</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> 10453 10454 <span class="special">};</span> 10455<span class="special">}</span> 10456</pre> 10457<div class="section"> 10458<div class="titlepage"><div><div><h6 class="title"> 10459<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.constructor" title="Constructor scheduler_executor_wrapper(Scheduler&, Executor&)">Constructor 10460 <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&,</span> <span class="identifier">Executor</span><span class="special">&)</span></code></a> 10461</h6></div></div></div> 10462<pre class="programlisting"><span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span> 10463</pre> 10464<div class="variablelist"> 10465<p class="title"><b></b></p> 10466<dl class="variablelist"> 10467<dt><span class="term">Effects:</span></dt> 10468<dd><p> 10469 Constructs a <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span></code>. 10470 </p></dd> 10471<dt><span class="term">Throws:</span></dt> 10472<dd><p> 10473 Nothing. 10474 </p></dd> 10475</dl> 10476</div> 10477</div> 10478<div class="section"> 10479<div class="titlepage"><div><div><h6 class="title"> 10480<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.destructor" title="Destructor ~scheduler_executor_wrapper()">Destructor 10481 <code class="computeroutput"><span class="special">~</span><span class="identifier">scheduler_executor_wrapper</span><span class="special">()</span></code></a> 10482</h6></div></div></div> 10483<pre class="programlisting"><span class="special">~</span><span class="identifier">scheduler_executor_wrapper</span><span class="special">();</span> 10484</pre> 10485<div class="variablelist"> 10486<p class="title"><b></b></p> 10487<dl class="variablelist"> 10488<dt><span class="term">Effects:</span></dt> 10489<dd><p> 10490 Destroys the <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span></code>. 10491 </p></dd> 10492<dt><span class="term">Synchronization:</span></dt> 10493<dd><p> 10494 The completion of all the closures happen before the completion 10495 of the executor destructor. 10496 </p></dd> 10497</dl> 10498</div> 10499</div> 10500<div class="section"> 10501<div class="titlepage"><div><div><h6 class="title"> 10502<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.underlying_scheduler"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.underlying_scheduler" title="Function member underlying_scheduler()">Function 10503 member <code class="computeroutput"><span class="identifier">underlying_scheduler</span><span class="special">()</span></code></a> 10504</h6></div></div></div> 10505<pre class="programlisting"><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">underlying_scheduler</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 10506</pre> 10507<div class="variablelist"> 10508<p class="title"><b></b></p> 10509<dl class="variablelist"> 10510<dt><span class="term">Return:</span></dt> 10511<dd><p> 10512 The underlying scheduler instance. 10513 </p></dd> 10514</dl> 10515</div> 10516</div> 10517<div class="section"> 10518<div class="titlepage"><div><div><h6 class="title"> 10519<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.underlying_executor" title="Function member underlying_executor()">Function 10520 member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a> 10521</h6></div></div></div> 10522<pre class="programlisting"><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 10523</pre> 10524<div class="variablelist"> 10525<p class="title"><b></b></p> 10526<dl class="variablelist"> 10527<dt><span class="term">Return:</span></dt> 10528<dd><p> 10529 The underlying executor instance. 10530 </p></dd> 10531</dl> 10532</div> 10533</div> 10534<div class="section"> 10535<div class="titlepage"><div><div><h6 class="title"> 10536<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_at"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_at" title="Template Function Member submit()">Template 10537 Function Member <code class="computeroutput"><span class="identifier">submit</span><span class="special">()</span></code></a> 10538</h6></div></div></div> 10539<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10540<span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10541</pre> 10542<div class="variablelist"> 10543<p class="title"><b></b></p> 10544<dl class="variablelist"> 10545<dt><span class="term">Effects:</span></dt> 10546<dd><p> 10547 Submit the <code class="computeroutput"><span class="identifier">closure</span></code> 10548 on the underlying executor. 10549 </p></dd> 10550<dt><span class="term">Throws:</span></dt> 10551<dd><p> 10552 Nothing. 10553 </p></dd> 10554</dl> 10555</div> 10556</div> 10557<div class="section"> 10558<div class="titlepage"><div><div><h6 class="title"> 10559<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_at0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_at0" title="Template Function Member submit_at()">Template 10560 Function Member <code class="computeroutput"><span class="identifier">submit_at</span><span class="special">()</span></code></a> 10561</h6></div></div></div> 10562<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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10563<span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10564</pre> 10565<div class="variablelist"> 10566<p class="title"><b></b></p> 10567<dl class="variablelist"> 10568<dt><span class="term">Effects:</span></dt> 10569<dd><p> 10570 Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code> 10571 to be executed on the underlying executor at <code class="computeroutput"><span class="identifier">abs_time</span></code>. 10572 </p></dd> 10573<dt><span class="term">Throws:</span></dt> 10574<dd><p> 10575 Nothing. 10576 </p></dd> 10577</dl> 10578</div> 10579</div> 10580<div class="section"> 10581<div class="titlepage"><div><div><h6 class="title"> 10582<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_after"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_after" title="Template Function Member submit_after()">Template 10583 Function Member <code class="computeroutput"><span class="identifier">submit_after</span><span class="special">()</span></code></a> 10584</h6></div></div></div> 10585<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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10586<span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10587</pre> 10588<div class="variablelist"> 10589<p class="title"><b></b></p> 10590<dl class="variablelist"> 10591<dt><span class="term">Effects:</span></dt> 10592<dd><p> 10593 Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code> 10594 to be executed on the underlying executor after <code class="computeroutput"><span class="identifier">rel_time</span></code>. 10595 </p></dd> 10596<dt><span class="term">Throws:</span></dt> 10597<dd><p> 10598 Nothing. 10599 </p></dd> 10600</dl> 10601</div> 10602</div> 10603</div> 10604<div class="section"> 10605<div class="titlepage"><div><div><h5 class="title"> 10606<a name="thread.synchronization.executors.ref.resubmit_at_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor" title="Template Class resubmit_at_executor">Template 10607 Class <code class="computeroutput"><span class="identifier">resubmit_at_executor</span></code></a> 10608</h5></div></div></div> 10609<p> 10610 <code class="computeroutput"><span class="identifier">Executor</span></code> wrapping an 10611 <code class="computeroutput"><span class="identifier">Scheduler</span></code>, an <code class="computeroutput"><span class="identifier">Executor</span></code> and a <code class="computeroutput"><span class="identifier">time_point</span></code> 10612 providing an <code class="computeroutput"><span class="identifier">Executor</span></code> 10613 interface. 10614 </p> 10615<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">executors</span><span class="special">/</span><span class="identifier">scheduler</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 10616<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 10617 10618 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Scheduler</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span> 10619 <span class="keyword">class</span> <span class="identifier">resubmit_at_executor</span> 10620 <span class="special">{</span> 10621 <span class="keyword">public</span><span class="special">:</span> 10622 <span class="keyword">using</span> <span class="identifier">work</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">work</span><span class="special">;</span> 10623 <span class="keyword">using</span> <span class="identifier">clock</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">clock</span><span class="special">;</span> 10624 10625 <span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">resubmit_at_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10626 <span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">resubmit_at_executor</span> <span class="special">&&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10627 <span class="identifier">resubmit_at_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">resubmit_at_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10628 <span class="identifier">resubmit_at_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">resubmit_at_executor</span> <span class="special">&&)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span> 10629 10630 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> 10631 <span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Duration</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">tp</span><span class="special">);</span> 10632 <span class="special">~</span><span class="identifier">resubmit_at_executor</span><span class="special">();</span> 10633 10634 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 10635 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 10636 10637 <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">();</span> 10638 <span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">underlying_scheduler</span><span class="special">();</span> 10639 10640 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Closure</span><span class="special">></span> 10641 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10642 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Work</span><span class="special">></span> 10643 <span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10644 <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">typename</span> <span class="identifier">Work</span><span class="special">></span> 10645 <span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10646 10647 <span class="special">};</span> 10648<span class="special">}</span> 10649</pre> 10650<div class="section"> 10651<div class="titlepage"><div><div><h6 class="title"> 10652<a name="thread.synchronization.executors.ref.resubmit_at_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.constructor" title="Constructor resubmit_at_executor(Scheduler&, Executor&, clock::time_point<Duration>)">Constructor 10653 <code class="computeroutput"><span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&,</span> <span class="identifier">Executor</span><span class="special">&,</span> <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Duration</span><span class="special">>)</span></code></a> 10654</h6></div></div></div> 10655<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">></span> 10656<span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">,</span> <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special"><</span><span class="identifier">Duration</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">tp</span><span class="special">);</span> 10657</pre> 10658<div class="variablelist"> 10659<p class="title"><b></b></p> 10660<dl class="variablelist"> 10661<dt><span class="term">Effects:</span></dt> 10662<dd><p> 10663 Constructs a <code class="computeroutput"><span class="identifier">resubmit_at_executor</span></code>. 10664 </p></dd> 10665<dt><span class="term">Throws:</span></dt> 10666<dd><p> 10667 Nothing. 10668 </p></dd> 10669</dl> 10670</div> 10671</div> 10672<div class="section"> 10673<div class="titlepage"><div><div><h6 class="title"> 10674<a name="thread.synchronization.executors.ref.resubmit_at_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.destructor" title="Destructor ~resubmit_at_executor()">Destructor 10675 <code class="computeroutput"><span class="special">~</span><span class="identifier">resubmit_at_executor</span><span class="special">()</span></code></a> 10676</h6></div></div></div> 10677<pre class="programlisting"><span class="special">~</span><span class="identifier">resubmit_at_executor</span><span class="special">();</span> 10678</pre> 10679<div class="variablelist"> 10680<p class="title"><b></b></p> 10681<dl class="variablelist"> 10682<dt><span class="term">Effects:</span></dt> 10683<dd><p> 10684 Destroys the executor_adaptor. 10685 </p></dd> 10686<dt><span class="term">Synchronization:</span></dt> 10687<dd><p> 10688 The completion of all the closures happen before the completion 10689 of the executor destructor. 10690 </p></dd> 10691</dl> 10692</div> 10693</div> 10694<div class="section"> 10695<div class="titlepage"><div><div><h6 class="title"> 10696<a name="thread.synchronization.executors.ref.resubmit_at_executor.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.underlying_executor" title="Function member underlying_executor()">Function 10697 member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a> 10698</h6></div></div></div> 10699<pre class="programlisting"><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 10700</pre> 10701<div class="variablelist"> 10702<p class="title"><b></b></p> 10703<dl class="variablelist"> 10704<dt><span class="term">Return:</span></dt> 10705<dd><p> 10706 The underlying executor instance. 10707 </p></dd> 10708</dl> 10709</div> 10710</div> 10711<div class="section"> 10712<div class="titlepage"><div><div><h6 class="title"> 10713<a name="thread.synchronization.executors.ref.resubmit_at_executor.underlying_scheduler"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.underlying_scheduler" title="Function member underlying_scheduler()">Function 10714 member <code class="computeroutput"><span class="identifier">underlying_scheduler</span><span class="special">()</span></code></a> 10715</h6></div></div></div> 10716<pre class="programlisting"><span class="identifier">Scheduler</span><span class="special">&</span> <span class="identifier">underlying_scheduler</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 10717</pre> 10718<div class="variablelist"> 10719<p class="title"><b></b></p> 10720<dl class="variablelist"> 10721<dt><span class="term">Return:</span></dt> 10722<dd><p> 10723 The underlying scheduler instance. 10724 </p></dd> 10725</dl> 10726</div> 10727</div> 10728<div class="section"> 10729<div class="titlepage"><div><div><h6 class="title"> 10730<a name="thread.synchronization.executors.ref.resubmit_at_executor.submit_at"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.submit_at" title="Template Function Member submit()">Template 10731 Function Member <code class="computeroutput"><span class="identifier">submit</span><span class="special">()</span></code></a> 10732</h6></div></div></div> 10733<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10734<span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10735</pre> 10736<div class="variablelist"> 10737<p class="title"><b></b></p> 10738<dl class="variablelist"> 10739<dt><span class="term">Effects:</span></dt> 10740<dd><p> 10741 Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code> 10742 to be executed on the underlying executor at the <code class="computeroutput"><span class="identifier">abs_time</span></code> given at construction 10743 time. 10744 </p></dd> 10745<dt><span class="term">Throws:</span></dt> 10746<dd><p> 10747 Nothing. 10748 </p></dd> 10749</dl> 10750</div> 10751</div> 10752<div class="section"> 10753<div class="titlepage"><div><div><h6 class="title"> 10754<a name="thread.synchronization.executors.ref.resubmit_at_executor.submit_at0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.submit_at0" title="Template Function Member submit_at()">Template 10755 Function Member <code class="computeroutput"><span class="identifier">submit_at</span><span class="special">()</span></code></a> 10756</h6></div></div></div> 10757<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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10758<span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10759</pre> 10760<div class="variablelist"> 10761<p class="title"><b></b></p> 10762<dl class="variablelist"> 10763<dt><span class="term">Effects:</span></dt> 10764<dd><p> 10765 Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code> 10766 to be executed on the underlying executor at <code class="computeroutput"><span class="identifier">abs_time</span></code>. 10767 </p></dd> 10768<dt><span class="term">Throws:</span></dt> 10769<dd><p> 10770 Nothing. 10771 </p></dd> 10772</dl> 10773</div> 10774</div> 10775<div class="section"> 10776<div class="titlepage"><div><div><h6 class="title"> 10777<a name="thread.synchronization.executors.ref.resubmit_at_executor.submit_after"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.submit_after" title="Template Function Member submit_after()">Template 10778 Function Member <code class="computeroutput"><span class="identifier">submit_after</span><span class="special">()</span></code></a> 10779</h6></div></div></div> 10780<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">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10781<span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</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="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10782</pre> 10783<div class="variablelist"> 10784<p class="title"><b></b></p> 10785<dl class="variablelist"> 10786<dt><span class="term">Effects:</span></dt> 10787<dd><p> 10788 Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code> 10789 to be executed on the underlying executor after <code class="computeroutput"><span class="identifier">rel_time</span></code>. 10790 </p></dd> 10791<dt><span class="term">Throws:</span></dt> 10792<dd><p> 10793 Nothing. 10794 </p></dd> 10795</dl> 10796</div> 10797</div> 10798</div> 10799<div class="section"> 10800<div class="titlepage"><div><div><h5 class="title"> 10801<a name="thread.synchronization.executors.ref.serial_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor" title="Template Class serial_executor">Template 10802 Class <code class="computeroutput"><span class="identifier">serial_executor</span></code></a> 10803</h5></div></div></div> 10804<p> 10805 A serial executor ensuring that there are no two work units that executes 10806 concurrently. 10807 </p> 10808<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">executors</span><span class="special">/</span><span class="identifier">serial_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 10809<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 10810 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span> 10811 <span class="keyword">class</span> <span class="identifier">serial_executor</span> 10812 <span class="special">{</span> 10813 <span class="keyword">public</span><span class="special">:</span> 10814 <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">serial_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 10815 <span class="identifier">serial_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">serial_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 10816 10817 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span> 10818 <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span> 10819 10820 <span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 10821 10822 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 10823 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 10824 10825 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10826 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10827 10828 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span> 10829 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span> 10830 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span> 10831 10832 <span class="special">};</span> 10833<span class="special">}</span> 10834</pre> 10835<div class="section"> 10836<div class="titlepage"><div><div><h6 class="title"> 10837<a name="thread.synchronization.executors.ref.serial_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.constructor" title="Constructor serial_executor(Executor&)">Constructor 10838 <code class="computeroutput"><span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&)</span></code></a> 10839</h6></div></div></div> 10840<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span> 10841<span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">);</span> 10842</pre> 10843<div class="variablelist"> 10844<p class="title"><b></b></p> 10845<dl class="variablelist"> 10846<dt><span class="term">Effects:</span></dt> 10847<dd><p> 10848 Constructs a serial_executor. 10849 </p></dd> 10850<dt><span class="term">Throws:</span></dt> 10851<dd><p> 10852 Nothing. 10853 </p></dd> 10854</dl> 10855</div> 10856</div> 10857<div class="section"> 10858<div class="titlepage"><div><div><h6 class="title"> 10859<a name="thread.synchronization.executors.ref.serial_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.destructor" title="Destructor ~serial_executor()">Destructor 10860 <code class="computeroutput"><span class="special">~</span><span class="identifier">serial_executor</span><span class="special">()</span></code></a> 10861</h6></div></div></div> 10862<pre class="programlisting"><span class="special">~</span><span class="identifier">serial_executor</span><span class="special">();</span> 10863</pre> 10864<div class="variablelist"> 10865<p class="title"><b></b></p> 10866<dl class="variablelist"> 10867<dt><span class="term">Effects:</span></dt> 10868<dd><p> 10869 Destroys the serial_executor. 10870 </p></dd> 10871<dt><span class="term">Synchronization:</span></dt> 10872<dd><p> 10873 The completion of all the closures happen before the completion 10874 of the executor destructor. 10875 </p></dd> 10876</dl> 10877</div> 10878</div> 10879<div class="section"> 10880<div class="titlepage"><div><div><h6 class="title"> 10881<a name="thread.synchronization.executors.ref.serial_executor.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.underlying_executor" title="Function member underlying_executor()">Function 10882 member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a> 10883</h6></div></div></div> 10884<pre class="programlisting"><span class="identifier">generic_executor_ref</span><span class="special">&</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 10885</pre> 10886<div class="variablelist"> 10887<p class="title"><b></b></p> 10888<dl class="variablelist"> 10889<dt><span class="term">Return:</span></dt> 10890<dd><p> 10891 The underlying executor instance. 10892 </p></dd> 10893<dt><span class="term">Throws:</span></dt> 10894<dd><p> 10895 Nothing. 10896 </p></dd> 10897</dl> 10898</div> 10899</div> 10900</div> 10901<div class="section"> 10902<div class="titlepage"><div><div><h5 class="title"> 10903<a name="thread.synchronization.executors.ref.inline_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor" title="Class inline_executor">Class 10904 <code class="computeroutput"><span class="identifier">inline_executor</span></code></a> 10905</h5></div></div></div> 10906<p> 10907 A serial executor ensuring that there are no two work units that executes 10908 concurrently. 10909 </p> 10910<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">executors</span><span class="special">/</span><span class="identifier">inline_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 10911<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 10912 <span class="keyword">class</span> <span class="identifier">inline_executor</span> 10913 <span class="special">{</span> 10914 <span class="keyword">public</span><span class="special">:</span> 10915 <span class="identifier">inline_executor</span><span class="special">(</span><span class="identifier">inline_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 10916 <span class="identifier">inline_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">inline_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 10917 10918 <span class="identifier">inline_executor</span><span class="special">();</span> 10919 10920 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 10921 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 10922 10923 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 10924 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 10925 10926 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span> 10927 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span> 10928 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span> 10929 10930 <span class="special">};</span> 10931<span class="special">}</span> 10932</pre> 10933<div class="section"> 10934<div class="titlepage"><div><div><h6 class="title"> 10935<a name="thread.synchronization.executors.ref.inline_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor.constructor" title="Constructor inline_executor()">Constructor 10936 <code class="computeroutput"><span class="identifier">inline_executor</span><span class="special">()</span></code></a> 10937</h6></div></div></div> 10938<pre class="programlisting"><span class="identifier">inline_executor</span><span class="special">();</span> 10939</pre> 10940<div class="variablelist"> 10941<p class="title"><b></b></p> 10942<dl class="variablelist"> 10943<dt><span class="term">Effects:</span></dt> 10944<dd><p> 10945 Constructs an inline_executor. 10946 </p></dd> 10947<dt><span class="term">Throws:</span></dt> 10948<dd><p> 10949 Nothing. 10950 </p></dd> 10951</dl> 10952</div> 10953</div> 10954<div class="section"> 10955<div class="titlepage"><div><div><h6 class="title"> 10956<a name="thread.synchronization.executors.ref.inline_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor.destructor" title="Destructor ~inline_executor()">Destructor 10957 <code class="computeroutput"><span class="special">~</span><span class="identifier">inline_executor</span><span class="special">()</span></code></a> 10958</h6></div></div></div> 10959<pre class="programlisting"><span class="special">~</span><span class="identifier">inline_executor</span><span class="special">();</span> 10960</pre> 10961<div class="variablelist"> 10962<p class="title"><b></b></p> 10963<dl class="variablelist"> 10964<dt><span class="term">Effects:</span></dt> 10965<dd><p> 10966 Destroys the inline_executor. 10967 </p></dd> 10968<dt><span class="term">Synchronization:</span></dt> 10969<dd><p> 10970 The completion of all the closures happen before the completion 10971 of the executor destructor. 10972 </p></dd> 10973</dl> 10974</div> 10975</div> 10976</div> 10977<div class="section"> 10978<div class="titlepage"><div><div><h5 class="title"> 10979<a name="thread.synchronization.executors.ref.basic_thread_pool"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool" title="Class basic_thread_pool">Class 10980 <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code></a> 10981</h5></div></div></div> 10982<p> 10983 A thread pool with up to a fixed number of threads. 10984 </p> 10985<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">executors</span><span class="special">/</span><span class="identifier">basic_thread_pool</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 10986<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 10987 <span class="keyword">class</span> <span class="identifier">basic_thread_pool</span> 10988 <span class="special">{</span> 10989 <span class="keyword">public</span><span class="special">:</span> 10990 10991 <span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="identifier">basic_thread_pool</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 10992 <span class="identifier">basic_thread_pool</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">basic_thread_pool</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 10993 10994 <span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">thread_count</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">hardware_concurrency</span><span class="special">());</span> 10995 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">AtThreadEntry</span><span class="special">></span> 10996 <span class="identifier">basic_thread_pool</span><span class="special">(</span> <span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">thread_count</span><span class="special">,</span> <span class="identifier">AtThreadEntry</span> <span class="identifier">at_thread_entry</span><span class="special">);</span> 10997 <span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">();</span> 10998 10999 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 11000 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 11001 11002 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 11003 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 11004 11005 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span> 11006 11007 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span> 11008 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span> 11009 11010 <span class="special">};</span> 11011<span class="special">}</span> 11012</pre> 11013<div class="section"> 11014<div class="titlepage"><div><div><h6 class="title"> 11015<a name="thread.synchronization.executors.ref.basic_thread_pool.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool.constructor" title="Constructor basic_thread_pool(unsigned const)">Constructor 11016 <code class="computeroutput"><span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">const</span><span class="special">)</span></code></a> 11017</h6></div></div></div> 11018<div class="variablelist"> 11019<p class="title"><b></b></p> 11020<dl class="variablelist"> 11021<dt><span class="term">Effects:</span></dt> 11022<dd><p> 11023 creates a thread pool that runs closures on <code class="computeroutput"><span class="identifier">thread_count</span></code> 11024 threads. 11025 </p></dd> 11026<dt><span class="term">Throws:</span></dt> 11027<dd><p> 11028 Whatever exception is thrown while initializing the needed resources. 11029 </p></dd> 11030</dl> 11031</div> 11032</div> 11033<div class="section"> 11034<div class="titlepage"><div><div><h6 class="title"> 11035<a name="thread.synchronization.executors.ref.basic_thread_pool.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool.destructor" title="Destructor ~basic_thread_pool()">Destructor 11036 <code class="computeroutput"><span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">()</span></code></a> 11037</h6></div></div></div> 11038<pre class="programlisting"><span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">();</span> 11039</pre> 11040<div class="variablelist"> 11041<p class="title"><b></b></p> 11042<dl class="variablelist"> 11043<dt><span class="term">Effects:</span></dt> 11044<dd><p> 11045 Interrupts and joins all the threads and then destroys the threads. 11046 </p></dd> 11047<dt><span class="term">Synchronization:</span></dt> 11048<dd><p> 11049 The completion of all the closures happen before the completion 11050 of the executor destructor. 11051 </p></dd> 11052</dl> 11053</div> 11054</div> 11055</div> 11056<div class="section"> 11057<div class="titlepage"><div><div><h5 class="title"> 11058<a name="thread.synchronization.executors.ref.thread_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.thread_executor" title="Class thread_executor">Class 11059 <code class="computeroutput"><span class="identifier">thread_executor</span></code></a> 11060</h5></div></div></div> 11061<p> 11062 A thread_executor with a threads for each task. 11063 </p> 11064<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">executors</span><span class="special">/</span><span class="identifier">thread_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 11065<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 11066 <span class="keyword">class</span> <span class="identifier">thread_executor</span> 11067 <span class="special">{</span> 11068 <span class="keyword">public</span><span class="special">:</span> 11069 11070 <span class="identifier">thread_executor</span><span class="special">(</span><span class="identifier">thread_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 11071 <span class="identifier">thread_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">thread_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 11072 11073 <span class="identifier">thread_executor</span><span class="special">();</span> 11074 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">AtThreadEntry</span><span class="special">></span> 11075 <span class="identifier">basic_thread_pool</span><span class="special">(</span> <span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">thread_count</span><span class="special">,</span> <span class="identifier">AtThreadEntry</span> <span class="identifier">at_thread_entry</span><span class="special">);</span> 11076 <span class="special">~</span><span class="identifier">thread_executor</span><span class="special">();</span> 11077 11078 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 11079 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 11080 11081 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 11082 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 11083 11084 <span class="special">};</span> 11085<span class="special">}</span> 11086</pre> 11087<div class="section"> 11088<div class="titlepage"><div><div><h6 class="title"> 11089<a name="thread.synchronization.executors.ref.thread_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.thread_executor.constructor" title="Constructor thread_executor()">Constructor 11090 <code class="computeroutput"><span class="identifier">thread_executor</span><span class="special">()</span></code></a> 11091</h6></div></div></div> 11092<div class="variablelist"> 11093<p class="title"><b></b></p> 11094<dl class="variablelist"> 11095<dt><span class="term">Effects:</span></dt> 11096<dd><p> 11097 creates a thread_executor. 11098 </p></dd> 11099<dt><span class="term">Throws:</span></dt> 11100<dd><p> 11101 Whatever exception is thrown while initializing the needed resources. 11102 </p></dd> 11103</dl> 11104</div> 11105</div> 11106<div class="section"> 11107<div class="titlepage"><div><div><h6 class="title"> 11108<a name="thread.synchronization.executors.ref.thread_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.thread_executor.destructor" title="Destructor ~thread_executor()">Destructor 11109 <code class="computeroutput"><span class="special">~</span><span class="identifier">thread_executor</span><span class="special">()</span></code></a> 11110</h6></div></div></div> 11111<pre class="programlisting"><span class="special">~</span><span class="identifier">thread_executor</span><span class="special">();</span> 11112</pre> 11113<div class="variablelist"> 11114<p class="title"><b></b></p> 11115<dl class="variablelist"> 11116<dt><span class="term">Effects:</span></dt> 11117<dd><p> 11118 Waits for closures (if any) to complete, then joins and destroys 11119 the threads. 11120 </p></dd> 11121<dt><span class="term">Synchronization:</span></dt> 11122<dd><p> 11123 The completion of all the closures happen before the completion 11124 of the executor destructor. 11125 </p></dd> 11126</dl> 11127</div> 11128</div> 11129</div> 11130<div class="section"> 11131<div class="titlepage"><div><div><h5 class="title"> 11132<a name="thread.synchronization.executors.ref.loop_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor" title="Class loop_executor">Class 11133 <code class="computeroutput"><span class="identifier">loop_executor</span></code></a> 11134</h5></div></div></div> 11135<p> 11136 A user scheduled executor. 11137 </p> 11138<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">executors</span><span class="special">/</span><span class="identifier">loop_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 11139<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 11140 <span class="keyword">class</span> <span class="identifier">loop_executor</span> 11141 <span class="special">{</span> 11142 <span class="keyword">public</span><span class="special">:</span> 11143 11144 <span class="identifier">loop_executor</span><span class="special">(</span><span class="identifier">loop_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 11145 <span class="identifier">loop_executor</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">loop_executor</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 11146 11147 <span class="identifier">loop_executor</span><span class="special">();</span> 11148 <span class="special">~</span><span class="identifier">loop_executor</span><span class="special">();</span> 11149 11150 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span> 11151 <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span> 11152 11153 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">></span> 11154 <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&&</span> <span class="identifier">closure</span><span class="special">);</span> 11155 11156 <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span> 11157 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">></span> 11158 <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">pred</span><span class="special">);</span> 11159 11160 <span class="keyword">void</span> <span class="identifier">loop</span><span class="special">();</span> 11161 <span class="keyword">void</span> <span class="identifier">run_queued_closures</span><span class="special">();</span> 11162 <span class="special">};</span> 11163<span class="special">}</span> 11164</pre> 11165<div class="section"> 11166<div class="titlepage"><div><div><h6 class="title"> 11167<a name="thread.synchronization.executors.ref.loop_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.constructor" title="Constructor loop_executor()">Constructor 11168 <code class="computeroutput"><span class="identifier">loop_executor</span><span class="special">()</span></code></a> 11169</h6></div></div></div> 11170<pre class="programlisting"><span class="identifier">loop_executor</span><span class="special">();</span> 11171</pre> 11172<div class="variablelist"> 11173<p class="title"><b></b></p> 11174<dl class="variablelist"> 11175<dt><span class="term">Effects:</span></dt> 11176<dd><p> 11177 creates an executor that runs closures using one of its closure-executing 11178 methods. 11179 </p></dd> 11180<dt><span class="term">Throws:</span></dt> 11181<dd><p> 11182 Whatever exception is thrown while initializing the needed resources. 11183 </p></dd> 11184</dl> 11185</div> 11186</div> 11187<div class="section"> 11188<div class="titlepage"><div><div><h6 class="title"> 11189<a name="thread.synchronization.executors.ref.loop_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.destructor" title="Destructor ~loop_executor()">Destructor 11190 <code class="computeroutput"><span class="special">~</span><span class="identifier">loop_executor</span><span class="special">()</span></code></a> 11191</h6></div></div></div> 11192<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">loop_executor</span><span class="special">();</span> 11193</pre> 11194<div class="variablelist"> 11195<p class="title"><b></b></p> 11196<dl class="variablelist"> 11197<dt><span class="term">Effects:</span></dt> 11198<dd><p> 11199 Destroys the executor. 11200 </p></dd> 11201<dt><span class="term">Synchronization:</span></dt> 11202<dd><p> 11203 The completion of all the closures happen before the completion 11204 of the executor destructor. 11205 </p></dd> 11206</dl> 11207</div> 11208</div> 11209<div class="section"> 11210<div class="titlepage"><div><div><h6 class="title"> 11211<a name="thread.synchronization.executors.ref.loop_executor.loop"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.loop" title="Function member loop()">Function 11212 member <code class="computeroutput"><span class="identifier">loop</span><span class="special">()</span></code></a> 11213</h6></div></div></div> 11214<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">loop</span><span class="special">();</span> 11215</pre> 11216<div class="variablelist"> 11217<p class="title"><b></b></p> 11218<dl class="variablelist"> 11219<dt><span class="term">Return:</span></dt> 11220<dd><p> 11221 reschedule works until <code class="computeroutput"><span class="identifier">closed</span><span class="special">()</span></code> or empty. 11222 </p></dd> 11223<dt><span class="term">Throws:</span></dt> 11224<dd><p> 11225 whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code> 11226 throws. 11227 </p></dd> 11228</dl> 11229</div> 11230</div> 11231<div class="section"> 11232<div class="titlepage"><div><div><h6 class="title"> 11233<a name="thread.synchronization.executors.ref.loop_executor.run_queued_closures"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.run_queued_closures" title="Function member run_queued_closures()">Function 11234 member <code class="computeroutput"><span class="identifier">run_queued_closures</span><span class="special">()</span></code></a> 11235</h6></div></div></div> 11236<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">run_queued_closures</span><span class="special">();</span> 11237</pre> 11238<div class="variablelist"> 11239<p class="title"><b></b></p> 11240<dl class="variablelist"> 11241<dt><span class="term">Return:</span></dt> 11242<dd><p> 11243 reschedule the enqueued works. 11244 </p></dd> 11245<dt><span class="term">Throws:</span></dt> 11246<dd><p> 11247 whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code> 11248 throws. 11249 </p></dd> 11250</dl> 11251</div> 11252</div> 11253</div> 11254</div> 11255</div> 11256<div class="section"> 11257<div class="titlepage"><div><div><h3 class="title"> 11258<a name="thread.synchronization.futures"></a><a class="link" href="synchronization.html#thread.synchronization.futures" title="Futures">Futures</a> 11259</h3></div></div></div> 11260<div class="toc"><dl class="toc"> 11261<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.overview">Overview</a></span></dt> 11262<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.creating">Creating asynchronous 11263 values</a></span></dt> 11264<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.lazy_futures">Wait Callbacks 11265 and Lazy Futures</a></span></dt> 11266<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.at_thread_exit">Handling 11267 Detached Threads and Thread Specific Variables</a></span></dt> 11268<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.async">Executing asynchronously</a></span></dt> 11269<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.shared">Shared Futures</a></span></dt> 11270<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.make_ready_future">Making 11271 immediate futures easier</a></span></dt> 11272<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.then">Associating future 11273 continuations</a></span></dt> 11274<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference">Futures Reference</a></span></dt> 11275</dl></div> 11276<div class="section"> 11277<div class="titlepage"><div><div><h4 class="title"> 11278<a name="thread.synchronization.futures.overview"></a><a class="link" href="synchronization.html#thread.synchronization.futures.overview" title="Overview">Overview</a> 11279</h4></div></div></div> 11280<p> 11281 The futures library provides a means of handling synchronous future values, 11282 whether those values are generated by another thread, or on a single thread 11283 in response to external stimuli, or on-demand. 11284 </p> 11285<p> 11286 This is done through the provision of four class templates: <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> which are used to 11287 retrieve the asynchronous results, and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> which are used to 11288 generate the asynchronous results. 11289 </p> 11290<p> 11291 An instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> holds the one and only 11292 reference to a result. Ownership can be transferred between instances using 11293 the move constructor or move-assignment operator, but at most one instance 11294 holds a reference to a given asynchronous result. When the result is ready, 11295 it is returned from <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code></a> 11296 by rvalue-reference to allow the result to be moved or copied as appropriate 11297 for the type. 11298 </p> 11299<p> 11300 On the other hand, many instances of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> may reference the 11301 same result. Instances can be freely copied and assigned, and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code></a> 11302 returns a <code class="computeroutput"><span class="keyword">const</span></code> reference 11303 so that multiple calls to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code></a> 11304 are safe. You can move an instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> into an instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, thus transferring 11305 ownership of the associated asynchronous result, but not vice-versa. 11306 </p> 11307<p> 11308 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> is a simple way of running asynchronous 11309 tasks. A call to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> 11310 returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> that will contain the result 11311 of the task. 11312 </p> 11313<p> 11314 You can wait for futures either individually or with one of the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_any" title="Non-member function wait_for_any() - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">wait_for_any</span><span class="special">()</span></code></a> 11315 and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_all" title="Non-member function wait_for_all() - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">wait_for_all</span><span class="special">()</span></code></a> 11316 functions. 11317 </p> 11318</div> 11319<div class="section"> 11320<div class="titlepage"><div><div><h4 class="title"> 11321<a name="thread.synchronization.futures.creating"></a><a class="link" href="synchronization.html#thread.synchronization.futures.creating" title="Creating asynchronous values">Creating asynchronous 11322 values</a> 11323</h4></div></div></div> 11324<p> 11325 You can set the value in a future with either a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. A <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> is a callable object 11326 that wraps a function or callable object. When the packaged task is invoked, 11327 it invokes the contained function in turn, and populates a future with 11328 the return value. This is an answer to the perennial question: "how 11329 do I return a value from a thread?": package the function you wish 11330 to run as a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> and pass the packaged 11331 task to the thread constructor. The future retrieved from the packaged 11332 task can then be used to obtain the return value. If the function throws 11333 an exception, that is stored in the future in place of the return value. 11334 </p> 11335<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">()</span> 11336<span class="special">{</span> 11337 <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span> 11338<span class="special">}</span> 11339 11340<span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">pt</span><span class="special">(</span><span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">);</span> 11341<span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">fi</span><span class="special">=</span><span class="identifier">pt</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">();</span> 11342 11343<span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">task</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">pt</span><span class="special">));</span> <span class="comment">// launch task on a thread</span> 11344 11345<span class="identifier">fi</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span> <span class="comment">// wait for it to finish</span> 11346 11347<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">());</span> 11348<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_value</span><span class="special">());</span> 11349<span class="identifier">assert</span><span class="special">(!</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_exception</span><span class="special">());</span> 11350<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get_state</span><span class="special">()==</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span><span class="special">);</span> 11351<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span> 11352</pre> 11353<p> 11354 A <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> is a bit more low level: 11355 it just provides explicit functions to store a value or an exception in 11356 the associated future. A promise can therefore be used where the value 11357 may come from more than one possible source, or where a single operation 11358 may produce multiple values. 11359 </p> 11360<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">pi</span><span class="special">;</span> 11361<span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">fi</span><span class="special">;</span> 11362<span class="identifier">fi</span><span class="special">=</span><span class="identifier">pi</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">();</span> 11363 11364<span class="identifier">pi</span><span class="special">.</span><span class="identifier">set_value</span><span class="special">(</span><span class="number">42</span><span class="special">);</span> 11365 11366<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">());</span> 11367<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_value</span><span class="special">());</span> 11368<span class="identifier">assert</span><span class="special">(!</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_exception</span><span class="special">());</span> 11369<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get_state</span><span class="special">()==</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span><span class="special">);</span> 11370<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span> 11371</pre> 11372</div> 11373<div class="section"> 11374<div class="titlepage"><div><div><h4 class="title"> 11375<a name="thread.synchronization.futures.lazy_futures"></a><a class="link" href="synchronization.html#thread.synchronization.futures.lazy_futures" title="Wait Callbacks and Lazy Futures">Wait Callbacks 11376 and Lazy Futures</a> 11377</h4></div></div></div> 11378<p> 11379 Both <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> support <span class="emphasis"><em>wait 11380 callbacks</em></span> that are invoked when a thread blocks in a call to 11381 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> 11382 or <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 11383 on a future that is waiting for the result from the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>, in the thread that 11384 is doing the waiting. These can be set using the <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> member function on the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> in question. 11385 </p> 11386<p> 11387 This allows <span class="emphasis"><em>lazy futures</em></span> where the result is not actually 11388 computed until it is needed by some thread. In the example below, the call 11389 to <code class="computeroutput"><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code> 11390 invokes the callback <code class="computeroutput"><span class="identifier">invoke_lazy_task</span></code>, 11391 which runs the task to set the value. If you remove the call to <code class="computeroutput"><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>, the task is not ever run. 11392 </p> 11393<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">()</span> 11394<span class="special">{</span> 11395 <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span> 11396<span class="special">}</span> 11397 11398<span class="keyword">void</span> <span class="identifier">invoke_lazy_task</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="keyword">int</span><span class="special">>&</span> <span class="identifier">task</span><span class="special">)</span> 11399<span class="special">{</span> 11400 <span class="keyword">try</span> 11401 <span class="special">{</span> 11402 <span class="identifier">task</span><span class="special">();</span> 11403 <span class="special">}</span> 11404 <span class="keyword">catch</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span><span class="special">&)</span> 11405 <span class="special">{}</span> 11406<span class="special">}</span> 11407 11408<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 11409<span class="special">{</span> 11410 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">task</span><span class="special">(</span><span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">);</span> 11411 <span class="identifier">task</span><span class="special">.</span><span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">invoke_lazy_task</span><span class="special">);</span> 11412 <span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">task</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">());</span> 11413 11414 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span> 11415<span class="special">}</span> 11416</pre> 11417</div> 11418<div class="section"> 11419<div class="titlepage"><div><div><h4 class="title"> 11420<a name="thread.synchronization.futures.at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.at_thread_exit" title="Handling Detached Threads and Thread Specific Variables">Handling 11421 Detached Threads and Thread Specific Variables</a> 11422</h4></div></div></div> 11423<p> 11424 Detached threads pose a problem for objects with thread storage duration. 11425 If we use a mechanism other than <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">__join</span></code> 11426 to wait for 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> to complete its work - 11427 such as waiting for a future to be ready - then the destructors of thread 11428 specific variables will still be running after the waiting thread has resumed. 11429 This section explain how the standard mechanism can be used to make such 11430 synchronization safe by ensuring that the objects with thread storage duration 11431 are destroyed prior to the future being made ready. e.g. 11432 </p> 11433<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">find_the_answer</span><span class="special">();</span> <span class="comment">// uses thread specific objects</span> 11434<span class="keyword">void</span> <span class="identifier">thread_func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special"><</span><span class="keyword">int</span><span class="special">>&&</span> <span class="identifier">p</span><span class="special">)</span> 11435<span class="special">{</span> 11436 <span class="identifier">p</span><span class="special">.</span><span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">find_the_answer</span><span class="special">());</span> 11437<span class="special">}</span> 11438 11439<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 11440<span class="special">{</span> 11441 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">p</span><span class="special">;</span> 11442 <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">thread_func</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">p</span><span class="special">));</span> 11443 <span class="identifier">t</span><span class="special">.</span><span class="identifier">detach</span><span class="special">();</span> <span class="comment">// we're going to wait on the future</span> 11444 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special"><<</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">().</span><span class="identifier">get</span><span class="special">()<<</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 11445<span class="special">}</span> 11446</pre> 11447<p> 11448 When the call to <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> 11449 returns, we know that not only is the future value ready, but the thread 11450 specific variables on the other thread have also been destroyed. 11451 </p> 11452<p> 11453 Such mechanisms are provided for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span></code>, 11454 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code> and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code>. 11455 e.g. 11456 </p> 11457<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">task_executor</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="keyword">void</span><span class="special">(</span><span class="keyword">int</span><span class="special">)></span> <span class="identifier">task</span><span class="special">,</span><span class="keyword">int</span> <span class="identifier">param</span><span class="special">)</span> 11458<span class="special">{</span> 11459 <span class="identifier">task</span><span class="special">.</span><span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">param</span><span class="special">);</span> <span class="comment">// execute stored task</span> 11460<span class="special">}</span> <span class="comment">// destroy thread specific and wake threads waiting on futures from task</span> 11461</pre> 11462<p> 11463 Other threads can wait on a future obtained from the task without having 11464 to worry about races due to the execution of destructors of the thread 11465 specific objects from the task's thread. 11466 </p> 11467<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span> <span class="identifier">cv</span><span class="special">;</span> 11468<span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span> 11469<span class="identifier">complex_type</span> <span class="identifier">the_data</span><span class="special">;</span> 11470<span class="keyword">bool</span> <span class="identifier">data_ready</span><span class="special">;</span> 11471 11472<span class="keyword">void</span> <span class="identifier">thread_func</span><span class="special">()</span> 11473<span class="special">{</span> 11474 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span> 11475 <span class="identifier">the_data</span><span class="special">=</span><span class="identifier">find_the_answer</span><span class="special">();</span> 11476 <span class="identifier">data_ready</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span> 11477 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">cv</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">lk</span><span class="special">));</span> 11478<span class="special">}</span> <span class="comment">// destroy thread specific objects, notify cv, unlock mutex</span> 11479 11480<span class="keyword">void</span> <span class="identifier">waiting_thread</span><span class="special">()</span> 11481<span class="special">{</span> 11482 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">></span> <span class="identifier">lk</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span> 11483 <span class="keyword">while</span><span class="special">(!</span><span class="identifier">data_ready</span><span class="special">)</span> 11484 <span class="special">{</span> 11485 <span class="identifier">cv</span><span class="special">.</span><span class="identifier">wait</span><span class="special">(</span><span class="identifier">lk</span><span class="special">);</span> 11486 <span class="special">}</span> 11487 <span class="identifier">process</span><span class="special">(</span><span class="identifier">the_data</span><span class="special">);</span> 11488<span class="special">}</span> 11489</pre> 11490<p> 11491 The waiting thread is guaranteed that the thread specific objects used 11492 by <code class="computeroutput"><span class="identifier">thread_func</span><span class="special">()</span></code> 11493 have been destroyed by the time <code class="computeroutput"><span class="identifier">process</span><span class="special">(</span><span class="identifier">the_data</span><span class="special">)</span></code> is called. If the lock on <code class="computeroutput"><span class="identifier">m</span></code> is released and re-acquired after setting 11494 <code class="computeroutput"><span class="identifier">data_ready</span></code> and before calling 11495 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">notify_all_at_thread_exit</span><span class="special">()</span></code> 11496 then this does NOT hold, since the thread may return from the wait due 11497 to a spurious wake-up. 11498 </p> 11499</div> 11500<div class="section"> 11501<div class="titlepage"><div><div><h4 class="title"> 11502<a name="thread.synchronization.futures.async"></a><a class="link" href="synchronization.html#thread.synchronization.futures.async" title="Executing asynchronously">Executing asynchronously</a> 11503</h4></div></div></div> 11504<p> 11505 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> is a simple way of running asynchronous 11506 tasks to make use of the available hardware concurrency. A call to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> returns a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span></code> 11507 that will contain the result of the task. Depending on the launch policy, 11508 the task is either run asynchronously on its own thread or synchronously 11509 on whichever thread calls the <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> member functions on that <code class="computeroutput"><span class="identifier">future</span></code>. 11510 </p> 11511<p> 11512 A launch policy of either boost::launch::async, which asks the runtime 11513 to create an asynchronous thread, or boost::launch::deferred, which indicates 11514 you simply want to defer the function call until a later time (lazy evaluation). 11515 This argument is optional - if you omit it your function will use the default 11516 policy. 11517 </p> 11518<p> 11519 For example, consider computing the sum of a very large array. The first 11520 task is to not compute asynchronously when the overhead would be significant. 11521 The second task is to split the work into two pieces, one executed by the 11522 host thread and one executed asynchronously. 11523 </p> 11524<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">parallel_sum</span><span class="special">(</span><span class="keyword">int</span><span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">size</span><span class="special">)</span> 11525<span class="special">{</span> 11526 <span class="keyword">int</span> <span class="identifier">sum</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 11527 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">size</span> <span class="special"><</span> <span class="number">1000</span> <span class="special">)</span> 11528 <span class="keyword">for</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span> 11529 <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">data</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span> 11530 <span class="keyword">else</span> <span class="special">{</span> 11531 <span class="keyword">auto</span> <span class="identifier">handle</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span><span class="special">(</span><span class="identifier">parallel_sum</span><span class="special">,</span> <span class="identifier">data</span><span class="special">+</span><span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">,</span> <span class="identifier">size</span><span class="special">-</span><span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">);</span> 11532 <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">parallel_sum</span><span class="special">(</span><span class="identifier">data</span><span class="special">,</span> <span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">);</span> 11533 <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">handle</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span> 11534 <span class="special">}</span> 11535 <span class="keyword">return</span> <span class="identifier">sum</span><span class="special">;</span> 11536<span class="special">}</span> 11537</pre> 11538</div> 11539<div class="section"> 11540<div class="titlepage"><div><div><h4 class="title"> 11541<a name="thread.synchronization.futures.shared"></a><a class="link" href="synchronization.html#thread.synchronization.futures.shared" title="Shared Futures">Shared Futures</a> 11542</h4></div></div></div> 11543<p> 11544 <code class="computeroutput"><span class="identifier">shared_future</span></code> is designed 11545 to be shared between threads, that is to allow multiple concurrent get 11546 operations. 11547 </p> 11548<h6> 11549<a name="thread.synchronization.futures.shared.h0"></a> 11550 <span class="phrase"><a name="thread.synchronization.futures.shared.multiple_get"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.multiple_get">Multiple get</a> 11551 </h6> 11552<p> 11553 The second <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> 11554 call in the following example is undefined. 11555 </p> 11556<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">bad_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span> 11557 11558 <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">);</span> 11559 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span> 11560 <span class="special">{</span> 11561 <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> 11562 <span class="special">}</span> <span class="keyword">else</span> 11563 <span class="special">{</span> 11564 <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> 11565 <span class="special">}</span> 11566 <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is undefined</span> 11567<span class="special">}</span> 11568</pre> 11569<p> 11570 Using a <code class="computeroutput"><span class="identifier">shared_future</span></code> solves 11571 the issue 11572 </p> 11573<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">good_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span> 11574 11575 <span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">);</span> 11576 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span> 11577 <span class="special">{</span> 11578 <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> 11579 <span class="special">}</span> <span class="keyword">else</span> 11580 <span class="special">{</span> 11581 <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> 11582 <span class="special">}</span> 11583 <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span> 11584<span class="special">}</span> 11585</pre> 11586<h6> 11587<a name="thread.synchronization.futures.shared.h1"></a> 11588 <span class="phrase"><a name="thread.synchronization.futures.shared.share__"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.share__">share()</a> 11589 </h6> 11590<p> 11591 Naming the return type when declaring the <code class="computeroutput"><span class="identifier">shared_future</span></code> 11592 is needed; auto is not available within template argument lists. Here 11593 <code class="computeroutput"><span class="identifier">share</span><span class="special">()</span></code> 11594 could be used to simplify the code 11595 </p> 11596<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">better_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span> 11597 11598 <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">).</span><span class="identifier">share</span><span class="special">();</span> 11599 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span> 11600 <span class="special">{</span> 11601 <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> 11602 <span class="special">}</span> <span class="keyword">else</span> 11603 <span class="special">{</span> 11604 <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> 11605 <span class="special">}</span> 11606 <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span> 11607<span class="special">}</span> 11608</pre> 11609<h6> 11610<a name="thread.synchronization.futures.shared.h2"></a> 11611 <span class="phrase"><a name="thread.synchronization.futures.shared.writing_on_get__"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.writing_on_get__">Writing 11612 on get()</a> 11613 </h6> 11614<p> 11615 The user can either read or write the future variable. 11616 </p> 11617<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">write_to_get</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span> 11618 11619 <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">).</span><span class="identifier">share</span><span class="special">();</span> 11620 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span> 11621 <span class="special">{</span> 11622 <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> 11623 <span class="special">}</span> <span class="keyword">else</span> 11624 <span class="special">{</span> 11625 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond2</span> <span class="special">)</span> 11626 <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> 11627 <span class="keyword">else</span> 11628 <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">=</span> <span class="identifier">something</span><span class="special">();</span> <span class="comment">// assign to non-const reference. </span> 11629 <span class="special">}</span> 11630 <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span> 11631<span class="special">}</span> 11632</pre> 11633<p> 11634 This works because the <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><>::</span><span class="identifier">get</span><span class="special">()</span></code> function returns a non-const reference 11635 to the appropriate storage. Of course the access to this storage must be 11636 ensured by the user. The library doesn't ensure the access to the internal 11637 storage is thread safe. 11638 </p> 11639<p> 11640 There has been some work by the C++ standard committee on an <code class="computeroutput"><span class="identifier">atomic_future</span></code> that behaves as an <code class="computeroutput"><span class="identifier">atomic</span></code> variable, that is thread_safe, 11641 and a <code class="computeroutput"><span class="identifier">shared_future</span></code> that 11642 can be shared between several threads, but there were not enough consensus 11643 and time to get it ready for C++11. 11644 </p> 11645</div> 11646<div class="section"> 11647<div class="titlepage"><div><div><h4 class="title"> 11648<a name="thread.synchronization.futures.make_ready_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.make_ready_future" title="Making immediate futures easier">Making 11649 immediate futures easier</a> 11650</h4></div></div></div> 11651<p> 11652 Some functions may know the value at the point of construction. In these 11653 cases the value is immediately available, but needs to be returned as a 11654 future or shared_future. By using make_ready_future a future can be created 11655 which holds a pre-computed result in its shared state. 11656 </p> 11657<p> 11658 Without these features it is non-trivial to create a future directly from 11659 a value. First a promise must be created, then the promise is set, and 11660 lastly the future is retrieved from the promise. This can now be done with 11661 one operation. 11662 </p> 11663<h6> 11664<a name="thread.synchronization.futures.make_ready_future.h0"></a> 11665 <span class="phrase"><a name="thread.synchronization.futures.make_ready_future.make_ready_future"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.make_ready_future.make_ready_future">make_ready_future</a> 11666 </h6> 11667<p> 11668 This function creates a future for a given value. If no value is given 11669 then a future<void> is returned. This function is primarily useful 11670 in cases where sometimes, the return value is immediately available, but 11671 sometimes it is not. The example below illustrates, that in an error path 11672 the value is known immediately, however in other paths the function must 11673 return an eventual value represented as a future. 11674 </p> 11675<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">compute</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span> 11676<span class="special">{</span> 11677 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_ready_future</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 11678 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span> <span class="special"><</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_ready_future</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"Error"</span><span class="special">));</span> 11679 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">f1</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span><span class="special">([]()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">x</span><span class="special">+</span><span class="number">1</span><span class="special">;</span> <span class="special">});</span> 11680 <span class="keyword">return</span> <span class="identifier">f1</span><span class="special">;</span> 11681<span class="special">}</span> 11682</pre> 11683<p> 11684 There are two variations of this function. The first takes a value of any 11685 type, and returns a future of that type. The input value is passed to the 11686 shared state of the returned future. The second version takes no input 11687 and returns a future<void>. 11688 </p> 11689</div> 11690<div class="section"> 11691<div class="titlepage"><div><div><h4 class="title"> 11692<a name="thread.synchronization.futures.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.then" title="Associating future continuations">Associating future 11693 continuations</a> 11694</h4></div></div></div> 11695<p> 11696 In asynchronous programming, it is very common for one asynchronous operation, 11697 on completion, to invoke a second operation and pass data to it. The current 11698 C++ standard does not allow one to register a continuation to a future. 11699 With <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code>, 11700 instead of waiting for the result, a continuation is "attached" 11701 to the asynchronous operation, which is invoked when the result is ready. 11702 Continuations registered using the <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code> function will help to avoid blocking 11703 waits or wasting threads on polling, greatly improving the responsiveness 11704 and scalability of an application. 11705 </p> 11706<p> 11707 <code class="computeroutput"><span class="identifier">future</span><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code> 11708 provides the ability to sequentially compose two futures by declaring one 11709 to be the continuation of another. With <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code> 11710 the antecedent future is ready (has a value or exception stored in the 11711 shared state) before the continuation starts as instructed by the lambda 11712 function. 11713 </p> 11714<p> 11715 In the example below the <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">string</span><span class="special">></span></code> <code class="computeroutput"><span class="identifier">f2</span></code> 11716 is registered to be a continuation of <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span></code> <code class="computeroutput"><span class="identifier">f1</span></code> 11717 using the <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code> member function. This operation takes 11718 a lambda function which describes how <code class="computeroutput"><span class="identifier">f2</span></code> 11719 should proceed after <code class="computeroutput"><span class="identifier">f1</span></code> 11720 is ready. 11721 </p> 11722<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">future</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 11723<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span> 11724<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 11725<span class="special">{</span> 11726 <span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">f1</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">([]()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="number">123</span><span class="special">;</span> <span class="special">});</span> 11727 <span class="identifier">future</span><span class="special"><</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">f2</span> <span class="special">=</span> <span class="identifier">f1</span><span class="special">.</span><span class="identifier">then</span><span class="special">([](</span><span class="identifier">future</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">f</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">().</span><span class="identifier">to_string</span><span class="special">();</span> <span class="comment">// here .get() won't block });</span> 11728<span class="special">}</span> 11729</pre> 11730<p> 11731 One key feature of this function is the ability to chain multiple asynchronous 11732 operations. In asynchronous programming, it's common to define a sequence 11733 of operations, in which each continuation executes only when the previous 11734 one completes. In some cases, the antecedent future produces a value that 11735 the continuation accepts as input. By using <code class="computeroutput"><span class="identifier">future</span><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>, creating a chain of continuations becomes 11736 straightforward and intuitive: 11737 </p> 11738<pre class="programlisting"><span class="identifier">myFuture</span><span class="special">.</span><span class="identifier">then</span><span class="special">(...).</span><span class="identifier">then</span><span class="special">(...).</span><span class="identifier">then</span><span class="special">(...).</span> 11739</pre> 11740<p> 11741 Some points to note are: 11742 </p> 11743<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 11744<li class="listitem"> 11745 Each continuation will not begin until the preceding has completed. 11746 </li> 11747<li class="listitem"> 11748 If an exception is thrown, the following continuation can handle it 11749 in a try-catch block 11750 </li> 11751</ul></div> 11752<p> 11753 Input Parameters: 11754 </p> 11755<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 11756<li class="listitem"> 11757 Lambda function: One option which can be considered is to take two 11758 functions, one for success and one for error handling. However this 11759 option has not been retained for the moment. The lambda function takes 11760 a future as its input which carries the exception through. This makes 11761 propagating exceptions straightforward. This approach also simplifies 11762 the chaining of continuations. 11763 </li> 11764<li class="listitem"> 11765 Executor: Providing an overload to <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code>, to take an executor reference 11766 places great flexibility over the execution of the future in the programmer's 11767 hand. As described above, often taking a launch policy is not sufficient 11768 for powerful asynchronous operations. The lifetime of the executor 11769 must outlive the continuation. 11770 </li> 11771<li class="listitem"> 11772 Launch policy: if the additional flexibility that the executor provides 11773 is not required. 11774 </li> 11775</ul></div> 11776<p> 11777 Return values: The decision to return a future was based primarily on the 11778 ability to chain multiple continuations using <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>. 11779 This benefit of composability gives the programmer incredible control and 11780 flexibility over their code. Returning a <code class="computeroutput"><span class="identifier">future</span></code> 11781 object rather than a <code class="computeroutput"><span class="identifier">shared_future</span></code> 11782 is also a much cheaper operation thereby improving performance. A <code class="computeroutput"><span class="identifier">shared_future</span></code> object is not necessary 11783 to take advantage of the chaining feature. It is also easy to go from a 11784 <code class="computeroutput"><span class="identifier">future</span></code> to a <code class="computeroutput"><span class="identifier">shared_future</span></code> when needed using future::share(). 11785 </p> 11786</div> 11787<div class="section"> 11788<div class="titlepage"><div><div><h4 class="title"> 11789<a name="thread.synchronization.futures.reference"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference" title="Futures Reference">Futures Reference</a> 11790</h4></div></div></div> 11791<div class="toc"><dl class="toc"> 11792<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_state">Enumeration 11793 <code class="computeroutput"><span class="identifier">state</span></code></a></span></dt> 11794<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_errc">Enumeration 11795 <code class="computeroutput"><span class="identifier">future_errc</span></code></a></span></dt> 11796<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.launch">Enumeration 11797 <code class="computeroutput"><span class="identifier">launch</span></code></a></span></dt> 11798<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.is_error_code_enum">Specialization 11799 <code class="computeroutput"><span class="identifier">is_error_code_enum</span><span class="special"><</span><span class="identifier">future_errc</span><span class="special">></span></code></a></span></dt> 11800<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_error_code">Non-member 11801 function <code class="computeroutput"><span class="identifier">make_error_code</span><span class="special">()</span></code></a></span></dt> 11802<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_error_condition">Non-member 11803 function <code class="computeroutput"><span class="identifier">make_error_condition</span><span class="special">()</span></code></a></span></dt> 11804<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_category">Non-member 11805 function <code class="computeroutput"><span class="identifier">future_category</span><span class="special">()</span></code></a></span></dt> 11806<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_error">Class 11807 <code class="computeroutput"><span class="identifier">future_error</span></code></a></span></dt> 11808<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_status">Enumeration 11809 <code class="computeroutput"><span class="identifier">future_status</span></code></a></span></dt> 11810<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_error0">Class 11811 <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> EXPERIMENTAL</a></span></dt> 11812<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.unique_future"><code class="computeroutput"><span class="identifier">future</span></code> class template</a></span></dt> 11813<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.shared_future"><code class="computeroutput"><span class="identifier">shared_future</span></code> class template</a></span></dt> 11814<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.promise"><code class="computeroutput"><span class="identifier">promise</span></code> class template</a></span></dt> 11815<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.packaged_task"><code class="computeroutput"><span class="identifier">packaged_task</span></code> class template</a></span></dt> 11816<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.decay_copy">Non-member 11817 function <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code></a></span></dt> 11818<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.async">Non-member 11819 function <code class="computeroutput"><span class="identifier">async</span><span class="special">()</span></code></a></span></dt> 11820<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.wait_for_any">Non-member 11821 function <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code> 11822 - EXTENSION</a></span></dt> 11823<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.wait_for_all">Non-member 11824 function <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code> 11825 - EXTENSION</a></span></dt> 11826<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.when_all">Non-member 11827 function <code class="computeroutput"><span class="identifier">when_all</span><span class="special">()</span></code> 11828 - EXTENSION</a></span></dt> 11829<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.when_any">Non-member 11830 function <code class="computeroutput"><span class="identifier">when_any</span><span class="special">()</span></code> 11831 - EXTENSION</a></span></dt> 11832<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_ready_future">Non-member 11833 function <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> EXTENSION</a></span></dt> 11834<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_exceptional_future">Non-member 11835 function <code class="computeroutput"><span class="identifier">make_exceptional_future</span><span class="special">()</span></code> EXTENSION</a></span></dt> 11836<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_future">Non-member 11837 function <code class="computeroutput"><span class="identifier">make_future</span><span class="special">()</span></code> 11838 DEPRECATED</a></span></dt> 11839<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_shared_future">Non-member 11840 function <code class="computeroutput"><span class="identifier">make_shared_future</span><span class="special">()</span></code> DEPRECATED</a></span></dt> 11841</dl></div> 11842<pre class="programlisting"><span class="comment">//#include <boost/thread/future.hpp></span> 11843 11844<span class="keyword">namespace</span> <span class="identifier">boost</span> 11845<span class="special">{</span> 11846 <span class="keyword">namespace</span> <span class="identifier">future_state</span> <span class="comment">// EXTENSION</span> 11847 <span class="special">{</span> 11848 <span class="keyword">enum</span> <span class="identifier">state</span> <span class="special">{</span><span class="identifier">uninitialized</span><span class="special">,</span> <span class="identifier">waiting</span><span class="special">,</span> <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">moved</span><span class="special">};</span> 11849 <span class="special">}</span> 11850 11851 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_errc</span> 11852 <span class="special">{</span> 11853 <span class="identifier">broken_promise</span><span class="special">,</span> 11854 <span class="identifier">future_already_retrieved</span><span class="special">,</span> 11855 <span class="identifier">promise_already_satisfied</span><span class="special">,</span> 11856 <span class="identifier">no_state</span> 11857 <span class="special">};</span> 11858 11859 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">launch</span> 11860 <span class="special">{</span> 11861 <span class="identifier">none</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 11862 <span class="identifier">async</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 11863 <span class="identifier">deferred</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 11864 <span class="identifier">executor</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 11865 <span class="identifier">inherit</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 11866 <span class="identifier">any</span> <span class="special">=</span> <span class="identifier">async</span> <span class="special">|</span> <span class="identifier">deferred</span> 11867 <span class="special">};</span> 11868 11869 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_status</span> <span class="special">{</span> 11870 <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">timeout</span><span class="special">,</span> <span class="identifier">deferred</span> 11871 <span class="special">};</span> 11872 11873 <span class="keyword">namespace</span> <span class="identifier">system</span> 11874 <span class="special">{</span> 11875 <span class="keyword">template</span> <span class="special"><></span> 11876 <span class="keyword">struct</span> <span class="identifier">is_error_code_enum</span><span class="special"><</span><span class="identifier">future_errc</span><span class="special">></span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span> 11877 11878 <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span> 11879 11880 <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span> 11881 <span class="special">}</span> 11882 11883 <span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span><span class="special">&</span> <span class="identifier">future_category</span><span class="special">();</span> 11884 11885 <span class="keyword">class</span> <span class="identifier">future_error</span><span class="special">;</span> 11886 11887 <span class="keyword">class</span> <span class="identifier">exceptional_ptr</span><span class="special">;</span> 11888 11889 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span> 11890 <span class="keyword">class</span> <span class="identifier">promise</span><span class="special">;</span> 11891 11892 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span> 11893 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">>&</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">>&</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 11894 11895 <span class="keyword">namespace</span> <span class="identifier">container</span> <span class="special">{</span> 11896 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">></span> 11897 <span class="keyword">struct</span> <span class="identifier">uses_allocator</span><span class="special"><</span><span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">>,</span> <span class="identifier">Alloc</span><span class="special">>::</span> <span class="identifier">true_type</span><span class="special">;</span> 11898 <span class="special">}</span> 11899 11900 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span> 11901 <span class="keyword">class</span> <span class="identifier">future</span><span class="special">;</span> 11902 11903 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span> 11904 <span class="keyword">class</span> <span class="identifier">shared_future</span><span class="special">;</span> 11905 11906 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">></span> 11907 <span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">;</span> 11908 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special"><</span><span class="identifier">S</span><span class="special">>&,</span> <span class="identifier">packaged_task</span><span class="special"><</span><span class="identifier">S</span><span class="special">>&)</span> <span class="keyword">noexcept</span><span class="special">;</span> 11909 11910 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">></span> 11911 <span class="keyword">struct</span> <span class="identifier">uses_allocator</span><span class="special"><</span><span class="identifier">packaged_task</span> <span class="special"><</span><span class="identifier">S</span><span class="special">>,</span> <span class="identifier">Alloc</span><span class="special">>;</span> 11912 11913 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> 11914 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span> 11915 <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> 11916 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> 11917 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span> 11918 <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> 11919 11920 <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="special">...</span> <span class="identifier">Args</span><span class="special">></span> 11921 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span> 11922 <span class="identifier">async</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="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 11923 <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="special">...</span> <span class="identifier">Args</span><span class="special">></span> 11924 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span> 11925 <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</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="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 11926 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</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="special">...</span> <span class="identifier">Args</span><span class="special">></span> 11927 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span> 11928 <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&</span><span class="identifier">ex</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="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 11929 11930 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span> 11931 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 11932 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FS</span><span class="special">></span> 11933 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">Fs</span><span class="special">&...</span> <span class="identifier">fs</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 11934 11935 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span> 11936 <span class="identifier">Iterator</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 11937 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">Fs</span><span class="special">></span> 11938 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">Fs</span><span class="special">&...</span> <span class="identifier">fs</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 11939 11940 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">></span> 11941 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>></span> 11942 <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span> 11943 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> 11944 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">T</span><span class="special">>...></span> <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&...</span> <span class="identifier">futures</span><span class="special">);</span> 11945 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">></span> 11946 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>></span> 11947 <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 11948 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">T</span><span class="special">></span> 11949 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">T</span><span class="special">>...></span> <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&...</span> <span class="identifier">futures</span><span class="special">);</span> 11950 11951 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 11952 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// DEPRECATED</span> 11953 <span class="identifier">future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_future</span><span class="special">();</span> <span class="comment">// DEPRECATED</span> 11954 11955 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 11956 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 11957 <span class="identifier">future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 11958 11959 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 11960 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 11961 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 11962 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 11963 11964 11965 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 11966 <span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_shared_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// DEPRECATED</span> 11967 <span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_shared_future</span><span class="special">();</span> <span class="comment">// DEPRECATED</span> 11968</pre> 11969<div class="section"> 11970<div class="titlepage"><div><div><h5 class="title"> 11971<a name="thread.synchronization.futures.reference.future_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state">Enumeration 11972 <code class="computeroutput"><span class="identifier">state</span></code></a> 11973</h5></div></div></div> 11974<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">future_state</span> 11975<span class="special">{</span> 11976 <span class="keyword">enum</span> <span class="identifier">state</span> <span class="special">{</span><span class="identifier">uninitialized</span><span class="special">,</span> <span class="identifier">waiting</span><span class="special">,</span> <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">moved</span><span class="special">};</span> 11977<span class="special">}</span> 11978</pre> 11979</div> 11980<div class="section"> 11981<div class="titlepage"><div><div><h5 class="title"> 11982<a name="thread.synchronization.futures.reference.future_errc"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_errc" title="Enumeration future_errc">Enumeration 11983 <code class="computeroutput"><span class="identifier">future_errc</span></code></a> 11984</h5></div></div></div> 11985<pre class="programlisting"> <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_errc</span> 11986 <span class="special">{</span> 11987 <span class="identifier">broken_promise</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span> 11988 <span class="identifier">future_already_retrieved</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span> 11989 <span class="identifier">promise_already_satisfied</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span> 11990 <span class="identifier">no_state</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span> 11991 <span class="special">}</span> 11992 11993 11994<span class="identifier">The</span> <span class="keyword">enum</span> <span class="identifier">values</span> <span class="identifier">of</span> <span class="identifier">future_errc</span> <span class="identifier">are</span> <span class="identifier">distinct</span> <span class="keyword">and</span> <span class="keyword">not</span> <span class="identifier">zero</span><span class="special">.</span> 11995</pre> 11996</div> 11997<div class="section"> 11998<div class="titlepage"><div><div><h5 class="title"> 11999<a name="thread.synchronization.futures.reference.launch"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.launch" title="Enumeration launch">Enumeration 12000 <code class="computeroutput"><span class="identifier">launch</span></code></a> 12001</h5></div></div></div> 12002<pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">launch</span> 12003<span class="special">{</span> 12004 <span class="identifier">none</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 12005 <span class="identifier">async</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 12006 <span class="identifier">deferred</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 12007 <span class="identifier">executor</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 12008 <span class="identifier">inherit</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span> 12009 <span class="identifier">any</span> <span class="special">=</span> <span class="identifier">async</span> <span class="special">|</span> <span class="identifier">deferred</span> 12010<span class="special">};</span> 12011</pre> 12012<p> 12013 The enum type launch is a bitmask type with launch::async and launch::deferred 12014 denoting individual bits. 12015 </p> 12016<p> 12017 A future created with <code class="computeroutput"><span class="identifier">promise</span><span class="special"><></span></code> or with a <code class="computeroutput"><span class="identifier">packaged_task</span><span class="special"><></span></code> or with <code class="computeroutput"><span class="identifier">make_ready_future</span></code>/<code class="computeroutput"><span class="identifier">make_exceptional_future</span></code> (has no associated 12018 launch policy), has an implicit a launch policy of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">none</span></code>. 12019 </p> 12020<p> 12021 A future created by <code class="computeroutput"><span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span><span class="special">,</span> <span class="special">...)</span></code> 12022 or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span><span class="special">,</span> <span class="special">...)</span></code> 12023 has associated a launch policy <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>. 12024 A future created by <code class="computeroutput"><span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span><span class="special">,</span> <span class="special">...)</span></code> 12025 or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span><span class="special">,</span> <span class="special">...)</span></code> 12026 has associated a launch policy <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>. 12027 A future created by <code class="computeroutput"><span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">,</span> <span class="special">...)</span></code> 12028 or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">,</span> <span class="special">...)</span></code> 12029 or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">executor</span><span class="special">,</span> <span class="special">...)</span></code> 12030 has associated a launch policy <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">executor</span></code>. 12031 A future created by <code class="computeroutput"><span class="identifier">async</span><span class="special">(...)</span></code> or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(...)</span></code> 12032 has associated a launch policy <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">none</span></code>. 12033 </p> 12034<p> 12035 A future created by <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">inherit</span><span class="special">,</span> <span class="special">...)</span></code> 12036 has associated a launch policy parent future. 12037 </p> 12038<p> 12039 The <code class="computeroutput"><span class="identifier">executor</span></code> and the 12040 <code class="computeroutput"><span class="identifier">inherit</span></code> launch policies 12041 have a sense only can be user only on <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code>. 12042 </p> 12043</div> 12044<div class="section"> 12045<div class="titlepage"><div><div><h5 class="title"> 12046<a name="thread.synchronization.futures.reference.is_error_code_enum"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.is_error_code_enum" title="Specialization is_error_code_enum<future_errc>">Specialization 12047 <code class="computeroutput"><span class="identifier">is_error_code_enum</span><span class="special"><</span><span class="identifier">future_errc</span><span class="special">></span></code></a> 12048</h5></div></div></div> 12049<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span> 12050<span class="special">{</span> 12051 <span class="keyword">template</span> <span class="special"><></span> 12052 <span class="keyword">struct</span> <span class="identifier">is_error_code_enum</span><span class="special"><</span><span class="identifier">future_errc</span><span class="special">></span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span> 12053 12054<span class="special">}</span> 12055</pre> 12056</div> 12057<div class="section"> 12058<div class="titlepage"><div><div><h5 class="title"> 12059<a name="thread.synchronization.futures.reference.make_error_code"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_error_code" title="Non-member function make_error_code()">Non-member 12060 function <code class="computeroutput"><span class="identifier">make_error_code</span><span class="special">()</span></code></a> 12061</h5></div></div></div> 12062<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span> 12063<span class="special">{</span> 12064 <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span> 12065<span class="special">}</span> 12066</pre> 12067<div class="variablelist"> 12068<p class="title"><b></b></p> 12069<dl class="variablelist"> 12070<dt><span class="term">Returns:</span></dt> 12071<dd><p> 12072 <code class="computeroutput"><span class="identifier">error_code</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">e</span><span class="special">),</span> 12073 <span class="identifier">future_category</span><span class="special">())</span></code>. 12074 </p></dd> 12075</dl> 12076</div> 12077</div> 12078<div class="section"> 12079<div class="titlepage"><div><div><h5 class="title"> 12080<a name="thread.synchronization.futures.reference.make_error_condition"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_error_condition" title="Non-member function make_error_condition()">Non-member 12081 function <code class="computeroutput"><span class="identifier">make_error_condition</span><span class="special">()</span></code></a> 12082</h5></div></div></div> 12083<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span> 12084<span class="special">{</span> 12085 <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span> 12086<span class="special">}</span> 12087</pre> 12088<div class="variablelist"> 12089<p class="title"><b></b></p> 12090<dl class="variablelist"> 12091<dt><span class="term">Returns:</span></dt> 12092<dd><p> 12093 <code class="computeroutput"><span class="identifier">error_condition</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">e</span><span class="special">),</span> <span class="identifier">future_category</span><span class="special">())</span></code>. 12094 </p></dd> 12095</dl> 12096</div> 12097</div> 12098<div class="section"> 12099<div class="titlepage"><div><div><h5 class="title"> 12100<a name="thread.synchronization.futures.reference.future_category"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_category" title="Non-member function future_category()">Non-member 12101 function <code class="computeroutput"><span class="identifier">future_category</span><span class="special">()</span></code></a> 12102</h5></div></div></div> 12103<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span><span class="special">&</span> <span class="identifier">future_category</span><span class="special">();</span> 12104</pre> 12105<div class="variablelist"> 12106<p class="title"><b></b></p> 12107<dl class="variablelist"> 12108<dt><span class="term">Returns:</span></dt> 12109<dd><p> 12110 A reference to an object of a type derived from class error_category. 12111 </p></dd> 12112<dt><span class="term">Notes:</span></dt> 12113<dd><p> 12114 The object's <code class="computeroutput"><span class="identifier">default_error_condition</span></code> 12115 and equivalent virtual functions behave as specified for the class 12116 <code class="computeroutput"><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span></code>. The object's 12117 <code class="computeroutput"><span class="identifier">name</span></code> virtual function 12118 returns a pointer to the string "future". 12119 </p></dd> 12120</dl> 12121</div> 12122</div> 12123<div class="section"> 12124<div class="titlepage"><div><div><h5 class="title"> 12125<a name="thread.synchronization.futures.reference.future_error"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error" title="Class future_error">Class 12126 <code class="computeroutput"><span class="identifier">future_error</span></code></a> 12127</h5></div></div></div> 12128<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">future_error</span> 12129 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span> 12130<span class="special">{</span> 12131<span class="keyword">public</span><span class="special">:</span> 12132 <span class="identifier">future_error</span><span class="special">(</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">);</span> 12133 12134 <span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&</span> <span class="identifier">code</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">no_except</span><span class="special">;</span> 12135<span class="special">};</span> 12136</pre> 12137<div class="section"> 12138<div class="titlepage"><div><div><h6 class="title"> 12139<a name="thread.synchronization.futures.reference.future_error.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.constructor" title="Constructor">Constructor</a> 12140</h6></div></div></div> 12141<pre class="programlisting"><span class="identifier">future_error</span><span class="special">(</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">);</span> 12142</pre> 12143<div class="variablelist"> 12144<p class="title"><b></b></p> 12145<dl class="variablelist"> 12146<dt><span class="term">Effects:</span></dt> 12147<dd><p> 12148 Constructs a future_error. 12149 </p></dd> 12150<dt><span class="term">Postconditions:</span></dt> 12151<dd><p> 12152 <code class="computeroutput"><span class="identifier">code</span><span class="special">()==</span><span class="identifier">ec</span></code> 12153 </p></dd> 12154<dt><span class="term">Throws:</span></dt> 12155<dd><p> 12156 Nothing. 12157 </p></dd> 12158</dl> 12159</div> 12160</div> 12161<div class="section"> 12162<div class="titlepage"><div><div><h6 class="title"> 12163<a name="thread.synchronization.futures.reference.future_error.code"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.code" title="Member function code()">Member 12164 function <code class="computeroutput"><span class="identifier">code</span><span class="special">()</span></code></a> 12165</h6></div></div></div> 12166<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&</span> <span class="identifier">code</span><span class="special">()</span> <span class="keyword">const</span> <span class="identifier">no_except</span><span class="special">;</span> 12167</pre> 12168<div class="variablelist"> 12169<p class="title"><b></b></p> 12170<dl class="variablelist"> 12171<dt><span class="term">Returns:</span></dt> 12172<dd><p> 12173 The value of <code class="computeroutput"><span class="identifier">ec</span></code> 12174 that was passed to the object's constructor. 12175 </p></dd> 12176</dl> 12177</div> 12178</div> 12179</div> 12180<div class="section"> 12181<div class="titlepage"><div><div><h5 class="title"> 12182<a name="thread.synchronization.futures.reference.future_status"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_status" title="Enumeration future_status">Enumeration 12183 <code class="computeroutput"><span class="identifier">future_status</span></code></a> 12184</h5></div></div></div> 12185<pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_status</span> <span class="special">{</span> 12186 <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">timeout</span><span class="special">,</span> <span class="identifier">deferred</span> 12187<span class="special">};</span> 12188</pre> 12189</div> 12190<div class="section"> 12191<div class="titlepage"><div><div><h5 class="title"> 12192<a name="thread.synchronization.futures.reference.future_error0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error0" title="Class exceptional_ptr EXPERIMENTAL">Class 12193 <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> EXPERIMENTAL</a> 12194</h5></div></div></div> 12195<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">exceptional_ptr</span> 12196<span class="special">{</span> 12197<span class="keyword">public</span><span class="special">:</span> 12198 <span class="identifier">exceptional_ptr</span><span class="special">();</span> 12199 <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span> 12200 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">></span> 12201 <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">E</span><span class="special">&&</span> <span class="identifier">ex</span><span class="special">);</span> 12202<span class="special">};</span> 12203</pre> 12204<div class="section"> 12205<div class="titlepage"><div><div><h6 class="title"> 12206<a name="thread.synchronization.futures.reference.future_error.constructor0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.constructor0" title="Constructor">Constructor</a> 12207</h6></div></div></div> 12208<pre class="programlisting"><span class="identifier">exceptional_ptr</span><span class="special">();</span> 12209<span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span> 12210<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">></span> 12211<span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">E</span><span class="special">&&</span> <span class="identifier">ex</span><span class="special">);</span> 12212</pre> 12213<div class="variablelist"> 12214<p class="title"><b></b></p> 12215<dl class="variablelist"> 12216<dt><span class="term">Effects:</span></dt> 12217<dd><p> 12218 The exception that is passed in to the constructor or the current 12219 exception if no parameter is moved into the constructed <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> if it is an 12220 rvalue. Otherwise the exception is copied into the constructed 12221 <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>. 12222 </p></dd> 12223<dt><span class="term">Postconditions:</span></dt> 12224<dd><p> 12225 <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> 12226 <span class="special">==</span> <span class="keyword">true</span> 12227 <span class="special">&&</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="special">=</span> 12228 <span class="keyword">true</span> <span class="special">&&</span> 12229 <span class="identifier">has_value</span><span class="special">()</span> 12230 <span class="special">=</span> <span class="keyword">false</span></code> 12231 </p></dd> 12232<dt><span class="term">Throws:</span></dt> 12233<dd><p> 12234 Nothing. 12235 </p></dd> 12236</dl> 12237</div> 12238</div> 12239</div> 12240<div class="section"> 12241<div class="titlepage"><div><div><h5 class="title"> 12242<a name="thread.synchronization.futures.reference.unique_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code> class template</a> 12243</h5></div></div></div> 12244<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span> 12245<span class="keyword">class</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> 12246<span class="special">{</span> 12247 12248<span class="keyword">public</span><span class="special">:</span> 12249 <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 12250 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 12251 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 12252 12253 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 12254 <span class="special">~</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span> 12255 12256 <span class="comment">// move support</span> 12257 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 12258 <span class="keyword">explicit</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">>>&&</span> <span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12259 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 12260 12261 <span class="comment">// factories</span> 12262 <span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">share</span><span class="special">();</span> 12263 12264 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 12265 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 12266 <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12267 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Ex</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 12268 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 12269 <span class="identifier">then</span><span class="special">(</span><span class="identifier">Ex</span><span class="special">&</span> <span class="identifier">executor</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12270 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 12271 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 12272 <span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12273 12274 <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">unwrap</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 12275 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="identifier">fallback_to</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 12276 12277 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 12278 12279 <span class="comment">// retrieving the value</span> 12280 <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get</span><span class="special">();</span> 12281 <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12282 12283 <span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 12284 12285 <span class="comment">// functions to check state</span> 12286 <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 12287 <span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 12288 <span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 12289 <span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 12290 12291 <span class="comment">// waiting for the result to be ready</span> 12292 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 12293 <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> 12294 <span class="identifier">future_status</span> <span class="identifier">wait_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">const</span><span class="special">;</span> 12295 <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> 12296 <span class="identifier">future_status</span> <span class="identifier">wait_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">const</span><span class="special">;</span> 12297 12298<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATE_TIME</span> 12299 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">></span> 12300 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// DEPRECATED SINCE V3.0.0</span> 12301 <span class="keyword">bool</span> <span class="identifier">timed_wait_until</span><span class="special">(</span><span class="identifier">boost</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="keyword">const</span><span class="special">;</span> <span class="comment">// DEPRECATED SINCE V3.0.0</span> 12302<span class="preprocessor">#endif</span> 12303 <span class="keyword">typedef</span> <span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">state</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 12304 <span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 12305<span class="special">};</span> 12306</pre> 12307<div class="section"> 12308<div class="titlepage"><div><div><h6 class="title"> 12309<a name="thread.synchronization.futures.reference.unique_future.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.default_constructor" title="Default Constructor">Default 12310 Constructor</a> 12311</h6></div></div></div> 12312<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span> 12313</pre> 12314<div class="variablelist"> 12315<p class="title"><b></b></p> 12316<dl class="variablelist"> 12317<dt><span class="term">Effects:</span></dt> 12318<dd><p> 12319 Constructs an uninitialized <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>. 12320 </p></dd> 12321<dt><span class="term">Postconditions:</span></dt> 12322<dd><p> 12323 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span></code></a> returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12324 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. 12325 </p></dd> 12326<dt><span class="term">Throws:</span></dt> 12327<dd><p> 12328 Nothing. 12329 </p></dd> 12330</dl> 12331</div> 12332</div> 12333<div class="section"> 12334<div class="titlepage"><div><div><h6 class="title"> 12335<a name="thread.synchronization.futures.reference.unique_future.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.destructor" title="Destructor">Destructor</a> 12336</h6></div></div></div> 12337<pre class="programlisting"><span class="special">~</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span> 12338</pre> 12339<div class="variablelist"> 12340<p class="title"><b></b></p> 12341<dl class="variablelist"> 12342<dt><span class="term">Effects:</span></dt> 12343<dd><p> 12344 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 12345 </p></dd> 12346<dt><span class="term">Throws:</span></dt> 12347<dd><p> 12348 Nothing. 12349 </p></dd> 12350</dl> 12351</div> 12352</div> 12353<div class="section"> 12354<div class="titlepage"><div><div><h6 class="title"> 12355<a name="thread.synchronization.futures.reference.unique_future.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.move_constructor" title="Move Constructor">Move 12356 Constructor</a> 12357</h6></div></div></div> 12358<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 12359</pre> 12360<div class="variablelist"> 12361<p class="title"><b></b></p> 12362<dl class="variablelist"> 12363<dt><span class="term">Effects:</span></dt> 12364<dd><p> 12365 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>, and transfers 12366 ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code> 12367 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 12368 </p></dd> 12369<dt><span class="term">Postconditions:</span></dt> 12370<dd><p> 12371 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12372 returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> 12373 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. If <code class="computeroutput"><span class="identifier">other</span></code> was associated with a 12374 shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 12375 <code class="computeroutput"><span class="identifier">other</span></code> is not 12376 associated with any shared state. 12377 </p></dd> 12378<dt><span class="term">Throws:</span></dt> 12379<dd><p> 12380 Nothing. 12381 </p></dd> 12382<dt><span class="term">Notes:</span></dt> 12383<dd><p> 12384 If the compiler does not support rvalue-references, this is implemented 12385 using the boost.thread move emulation. 12386 </p></dd> 12387</dl> 12388</div> 12389</div> 12390<div class="section"> 12391<div class="titlepage"><div><div><h6 class="title"> 12392<a name="thread.synchronization.futures.reference.unique_future.unwrap_move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.unwrap_move_constructor" title="Unwrap Move Constructor - EXTENSION">Unwrap 12393 Move Constructor - EXTENSION</a> 12394</h6></div></div></div> 12395<pre class="programlisting"><span class="keyword">explicit</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">>>&&</span> <span class="identifier">other</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12396</pre> 12397<div class="warning"><table border="0" summary="Warning"> 12398<tr> 12399<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 12400<th align="left">Warning</th> 12401</tr> 12402<tr><td align="left" valign="top"><p> 12403 This constructor is experimental and subject to change in future 12404 versions. There are not too much tests yet, so it is possible that 12405 you can find out some trivial bugs :( 12406 </p></td></tr> 12407</table></div> 12408<div class="variablelist"> 12409<p class="title"><b></b></p> 12410<dl class="variablelist"> 12411<dt><span class="term">Requires:</span></dt> 12412<dd> 12413<p> 12414 <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">valid</span><span class="special">()</span></code>. 12415 </p> 12416<p> 12417 [Effects: 12418 </p> 12419<p> 12420 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>, and transfers 12421 ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code> 12422 and unwrapping the inner future (see <code class="computeroutput"><span class="identifier">unwrap</span><span class="special">()</span></code>). 12423 </p> 12424</dd> 12425<dt><span class="term">Postconditions:</span></dt> 12426<dd><p> 12427 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12428 returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> 12429 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. The associated 12430 shared state is now unwrapped and the inner future shared state 12431 is associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. <code class="computeroutput"><span class="identifier">other</span></code> 12432 is not associated with any shared state, <code class="computeroutput"><span class="special">!</span> 12433 <span class="identifier">other</span><span class="special">.</span><span class="identifier">valid</span><span class="special">()</span></code>. 12434 </p></dd> 12435<dt><span class="term">Throws:</span></dt> 12436<dd><p> 12437 Nothing. 12438 </p></dd> 12439<dt><span class="term">Notes:</span></dt> 12440<dd><p> 12441 If the compiler does not support rvalue-references, this is implemented 12442 using the boost.thread move emulation. 12443 </p></dd> 12444</dl> 12445</div> 12446</div> 12447<div class="section"> 12448<div class="titlepage"><div><div><h6 class="title"> 12449<a name="thread.synchronization.futures.reference.unique_future.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.move_assignment" title="Move Assignment Operator">Move 12450 Assignment Operator</a> 12451</h6></div></div></div> 12452<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 12453</pre> 12454<div class="variablelist"> 12455<p class="title"><b></b></p> 12456<dl class="variablelist"> 12457<dt><span class="term">Effects:</span></dt> 12458<dd><p> 12459 Transfers ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 12460 </p></dd> 12461<dt><span class="term">Postconditions:</span></dt> 12462<dd><p> 12463 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12464 returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> 12465 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. If <code class="computeroutput"><span class="identifier">other</span></code> was associated with a 12466 shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 12467 <code class="computeroutput"><span class="identifier">other</span></code> is not 12468 associated with any shared state. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was associated with an asynchronous 12469 result prior to the call, that result no longer has an associated 12470 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> instance. 12471 </p></dd> 12472<dt><span class="term">Throws:</span></dt> 12473<dd><p> 12474 Nothing. 12475 </p></dd> 12476<dt><span class="term">Notes:</span></dt> 12477<dd><p> 12478 If the compiler does not support rvalue-references, this is implemented 12479 using the boost.thread move emulation. 12480 </p></dd> 12481</dl> 12482</div> 12483</div> 12484<div class="section"> 12485<div class="titlepage"><div><div><h6 class="title"> 12486<a name="thread.synchronization.futures.reference.unique_future.swap"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.swap" title="Member function swap()">Member 12487 function <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a> 12488</h6></div></div></div> 12489<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="identifier">no_except</span><span class="special">;</span> 12490</pre> 12491<div class="variablelist"> 12492<p class="title"><b></b></p> 12493<dl class="variablelist"> 12494<dt><span class="term">Effects:</span></dt> 12495<dd><p> 12496 Swaps ownership of the shared states associated with <code class="computeroutput"><span class="identifier">other</span></code> and <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 12497 </p></dd> 12498<dt><span class="term">Postconditions:</span></dt> 12499<dd><p> 12500 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12501 returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. <code class="computeroutput"><span class="identifier">other</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> 12502 returns the value of <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code> prior to the call. If <code class="computeroutput"><span class="identifier">other</span></code> was associated with a 12503 shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 12504 otherwise <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12505 has no associated result. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was associated with a shared 12506 state, that result is now associated with <code class="computeroutput"><span class="identifier">other</span></code>, 12507 otherwise <code class="computeroutput"><span class="identifier">other</span></code> 12508 has no associated result. 12509 </p></dd> 12510<dt><span class="term">Throws:</span></dt> 12511<dd><p> 12512 Nothing. 12513 </p></dd> 12514</dl> 12515</div> 12516</div> 12517<div class="section"> 12518<div class="titlepage"><div><div><h6 class="title"> 12519<a name="thread.synchronization.futures.reference.unique_future.get"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get" title="Member function get()">Member 12520 function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a> 12521</h6></div></div></div> 12522<pre class="programlisting"><span class="identifier">R</span> <span class="identifier">get</span><span class="special">();</span> 12523<span class="identifier">R</span><span class="special">&</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get</span><span class="special">();</span> 12524<span class="keyword">void</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get</span><span class="special">();</span> 12525</pre> 12526<div class="variablelist"> 12527<p class="title"><b></b></p> 12528<dl class="variablelist"> 12529<dt><span class="term">Effects:</span></dt> 12530<dd><p> 12531 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12532 is associated with a shared state, waits until the result is 12533 ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">wait</span><span class="special">()</span></code></a>, 12534 and retrieves the result (whether that is a value or an exception). 12535 </p></dd> 12536<dt><span class="term">Returns:</span></dt> 12537<dd> 12538<p> 12539 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get</span><span class="special">()</span></code> 12540 return the stored reference. 12541 </p> 12542<p> 12543 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code>, 12544 there is no return value. 12545 </p> 12546<p> 12547 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code> 12548 returns an rvalue-reference to the value stored in the shared 12549 state. 12550 </p> 12551</dd> 12552<dt><span class="term">Postconditions:</span></dt> 12553<dd><p> 12554 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 12555 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12556 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 12557 </p></dd> 12558<dt><span class="term">Throws:</span></dt> 12559<dd> 12560<p> 12561 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12562 is not associated with a shared state. 12563 </p> 12564<p> 12565 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 12566 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 12567 of the call, and the current thread is interrupted. 12568 </p> 12569<p> 12570 - Any exception stored in the shared state in place of a value. 12571 </p> 12572</dd> 12573<dt><span class="term">Notes:</span></dt> 12574<dd><p> 12575 <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> 12576 is an <span class="emphasis"><em>interruption point</em></span>. 12577 </p></dd> 12578</dl> 12579</div> 12580</div> 12581<div class="section"> 12582<div class="titlepage"><div><div><h6 class="title"> 12583<a name="thread.synchronization.futures.reference.unique_future.get_or"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_or" title="Member function get_or() - EXTENSION">Member 12584 function <code class="computeroutput"><span class="identifier">get_or</span><span class="special">()</span></code> 12585 - EXTENSION</a> 12586</h6></div></div></div> 12587<pre class="programlisting"><span class="identifier">R</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span><span class="special">&&</span> <span class="identifier">v</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12588<span class="identifier">R</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">v</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12589<span class="identifier">R</span><span class="special">&</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span><span class="special">&</span> <span class="identifier">v</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 12590<span class="keyword">void</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get_or</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 12591</pre> 12592<div class="warning"><table border="0" summary="Warning"> 12593<tr> 12594<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 12595<th align="left">Warning</th> 12596</tr> 12597<tr><td align="left" valign="top"><p> 12598 These functions are experimental and subject to change in future 12599 versions. There are not too much tests yet, so it is possible that 12600 you can find out some trivial bugs :( 12601 </p></td></tr> 12602</table></div> 12603<div class="variablelist"> 12604<p class="title"><b></b></p> 12605<dl class="variablelist"> 12606<dt><span class="term">Effects:</span></dt> 12607<dd><p> 12608 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12609 is associated with a shared state, waits until the result is 12610 ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">wait</span><span class="special">()</span></code></a>, 12611 and depending on whether the shared state <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> the retrieves the result. 12612 </p></dd> 12613<dt><span class="term">Returns:</span></dt> 12614<dd> 12615<p> 12616 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code> 12617 return the stored reference if has_value() and the passes parameter 12618 otherwise. 12619 </p> 12620<p> 12621 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get_or</span><span class="special">()</span></code>, 12622 there is no return value, but the function doesn't throws even 12623 if the shared state contained an exception. 12624 </p> 12625<p> 12626 - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code> 12627 returns an rvalue-reference to the value stored in the shared 12628 state if <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> and an rvalue-reference build 12629 with the parameter <code class="computeroutput"><span class="identifier">v</span></code>. 12630 </p> 12631</dd> 12632<dt><span class="term">Postconditions:</span></dt> 12633<dd><p> 12634 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 12635 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12636 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 12637 </p></dd> 12638<dt><span class="term">Throws:</span></dt> 12639<dd><p> 12640 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12641 is not associated with a shared state. 12642 </p></dd> 12643<dt><span class="term">Notes:</span></dt> 12644<dd><p> 12645 <code class="computeroutput"><span class="identifier">get_or</span><span class="special">()</span></code> 12646 is an <span class="emphasis"><em>interruption point</em></span>. 12647 </p></dd> 12648</dl> 12649</div> 12650</div> 12651<div class="section"> 12652<div class="titlepage"><div><div><h6 class="title"> 12653<a name="thread.synchronization.futures.reference.unique_future.wait"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()">Member 12654 function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a> 12655</h6></div></div></div> 12656<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 12657</pre> 12658<div class="variablelist"> 12659<p class="title"><b></b></p> 12660<dl class="variablelist"> 12661<dt><span class="term">Effects:</span></dt> 12662<dd><p> 12663 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12664 is associated with a shared state, waits until the result is 12665 ready. If the result is not ready on entry, and the result has 12666 a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked 12667 prior to waiting. 12668 </p></dd> 12669<dt><span class="term">Throws:</span></dt> 12670<dd> 12671<p> 12672 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12673 is not associated with a shared state. 12674 </p> 12675<p> 12676 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 12677 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 12678 of the call, and the current thread is interrupted. 12679 </p> 12680<p> 12681 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 12682 if such a callback is called. 12683 </p> 12684</dd> 12685<dt><span class="term">Postconditions:</span></dt> 12686<dd><p> 12687 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 12688 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12689 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 12690 </p></dd> 12691<dt><span class="term">Notes:</span></dt> 12692<dd><p> 12693 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> 12694 is an <span class="emphasis"><em>interruption point</em></span>. 12695 </p></dd> 12696</dl> 12697</div> 12698</div> 12699<div class="section"> 12700<div class="titlepage"><div><div><h6 class="title"> 12701<a name="thread.synchronization.futures.reference.unique_future.timed_wait_duration"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.timed_wait_duration" title="Member function timed_wait() DEPRECATED SINCE V3.0.0">Member 12702 function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 12703 DEPRECATED SINCE V3.0.0</a> 12704</h6></div></div></div> 12705<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">></span> 12706<span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">wait_duration</span><span class="special">);</span> 12707</pre> 12708<div class="warning"><table border="0" summary="Warning"> 12709<tr> 12710<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 12711<th align="left">Warning</th> 12712</tr> 12713<tr><td align="left" valign="top"> 12714<p> 12715 DEPRECATED since 3.00. 12716 </p> 12717<p> 12718 Use instead <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>. 12719 </p> 12720</td></tr> 12721</table></div> 12722<div class="variablelist"> 12723<p class="title"><b></b></p> 12724<dl class="variablelist"> 12725<dt><span class="term">Effects:</span></dt> 12726<dd><p> 12727 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12728 is associated with a shared state, waits until the result is 12729 ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code> 12730 has elapsed. If the result is not ready on entry, and the result 12731 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is 12732 invoked prior to waiting. 12733 </p></dd> 12734<dt><span class="term">Returns:</span></dt> 12735<dd><p> 12736 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12737 is associated with a shared state, and that result is ready before 12738 the specified time has elapsed, <code class="computeroutput"><span class="keyword">false</span></code> 12739 otherwise. 12740 </p></dd> 12741<dt><span class="term">Throws:</span></dt> 12742<dd> 12743<p> 12744 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12745 is not associated with a shared state. 12746 </p> 12747<p> 12748 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 12749 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 12750 of the call, and the current thread is interrupted. 12751 </p> 12752<p> 12753 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 12754 if such a callback is called. 12755 </p> 12756</dd> 12757<dt><span class="term">Postconditions:</span></dt> 12758<dd><p> 12759 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>, 12760 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 12761 returns <code class="computeroutput"><span class="keyword">true</span></code> and 12762 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12763 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 12764 </p></dd> 12765<dt><span class="term">Notes:</span></dt> 12766<dd><p> 12767 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 12768 is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that 12769 meets the Boost.DateTime time duration requirements. 12770 </p></dd> 12771</dl> 12772</div> 12773</div> 12774<div class="section"> 12775<div class="titlepage"><div><div><h6 class="title"> 12776<a name="thread.synchronization.futures.reference.unique_future.timed_wait_absolute"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.timed_wait_absolute" title="Member function timed_wait() DEPRECATED SINCE V3.0.0">Member 12777 function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 12778 DEPRECATED SINCE V3.0.0</a> 12779</h6></div></div></div> 12780<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">wait_timeout</span><span class="special">);</span> 12781</pre> 12782<div class="warning"><table border="0" summary="Warning"> 12783<tr> 12784<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 12785<th align="left">Warning</th> 12786</tr> 12787<tr><td align="left" valign="top"> 12788<p> 12789 DEPRECATED since 3.00. 12790 </p> 12791<p> 12792 Use instead <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>. 12793 </p> 12794</td></tr> 12795</table></div> 12796<div class="variablelist"> 12797<p class="title"><b></b></p> 12798<dl class="variablelist"> 12799<dt><span class="term">Effects:</span></dt> 12800<dd><p> 12801 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12802 is associated with a shared state, waits until the result is 12803 ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code> 12804 has passed. If the result is not ready on entry, and the result 12805 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is 12806 invoked prior to waiting. 12807 </p></dd> 12808<dt><span class="term">Returns:</span></dt> 12809<dd><p> 12810 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12811 is associated with a shared state, and that result is ready before 12812 the specified time has passed, <code class="computeroutput"><span class="keyword">false</span></code> 12813 otherwise. 12814 </p></dd> 12815<dt><span class="term">Throws:</span></dt> 12816<dd> 12817<p> 12818 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12819 is not associated with a shared state. 12820 </p> 12821<p> 12822 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 12823 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 12824 of the call, and the current thread is interrupted. 12825 </p> 12826<p> 12827 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 12828 if such a callback is called. 12829 </p> 12830</dd> 12831<dt><span class="term">Postconditions:</span></dt> 12832<dd><p> 12833 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>, 12834 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 12835 returns <code class="computeroutput"><span class="keyword">true</span></code> and 12836 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12837 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 12838 </p></dd> 12839<dt><span class="term">Notes:</span></dt> 12840<dd><p> 12841 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 12842 is an <span class="emphasis"><em>interruption point</em></span>. 12843 </p></dd> 12844</dl> 12845</div> 12846</div> 12847<div class="section"> 12848<div class="titlepage"><div><div><h6 class="title"> 12849<a name="thread.synchronization.futures.reference.unique_future.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait_for" title="Member function wait_for()">Member 12850 function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code></a> 12851</h6></div></div></div> 12852<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> 12853<span class="identifier">future_status</span> <span class="identifier">wait_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">const</span><span class="special">;</span> 12854</pre> 12855<div class="variablelist"> 12856<p class="title"><b></b></p> 12857<dl class="variablelist"> 12858<dt><span class="term">Effects:</span></dt> 12859<dd><p> 12860 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12861 is associated with a shared state, waits until the result is 12862 ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code> 12863 has elapsed. If the result is not ready on entry, and the result 12864 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is 12865 invoked prior to waiting. 12866 </p></dd> 12867<dt><span class="term">Returns:</span></dt> 12868<dd> 12869<p> 12870 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code> 12871 if the shared state contains a deferred function. (Not implemented 12872 yet) 12873 </p> 12874<p> 12875 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code> 12876 if the shared state is ready. 12877 </p> 12878<p> 12879 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code> 12880 if the function is returning because the relative timeout specified 12881 by <code class="computeroutput"><span class="identifier">rel_time</span></code> has 12882 expired. 12883 </p> 12884</dd> 12885<dt><span class="term">Throws:</span></dt> 12886<dd> 12887<p> 12888 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12889 is not associated with a shared state. 12890 </p> 12891<p> 12892 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 12893 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 12894 of the call, and the current thread is interrupted. 12895 </p> 12896<p> 12897 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 12898 if such a callback is called. 12899 </p> 12900</dd> 12901<dt><span class="term">Postconditions:</span></dt> 12902<dd><p> 12903 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>, 12904 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 12905 returns <code class="computeroutput"><span class="keyword">true</span></code> and 12906 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12907 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 12908 </p></dd> 12909<dt><span class="term">Notes:</span></dt> 12910<dd><p> 12911 <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code> 12912 is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that 12913 meets the Boost.DateTime time duration requirements. 12914 </p></dd> 12915</dl> 12916</div> 12917</div> 12918<div class="section"> 12919<div class="titlepage"><div><div><h6 class="title"> 12920<a name="thread.synchronization.futures.reference.unique_future.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait_until" title="Member function wait_until()">Member 12921 function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a> 12922</h6></div></div></div> 12923<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> 12924<span class="identifier">future_status</span> <span class="identifier">wait_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">const</span><span class="special">;</span> 12925</pre> 12926<div class="variablelist"> 12927<p class="title"><b></b></p> 12928<dl class="variablelist"> 12929<dt><span class="term">Effects:</span></dt> 12930<dd><p> 12931 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12932 is associated with a shared state, waits until the result is 12933 ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code> 12934 has passed. If the result is not ready on entry, and the result 12935 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is 12936 invoked prior to waiting. 12937 </p></dd> 12938<dt><span class="term">Returns:</span></dt> 12939<dd> 12940<p> 12941 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code> 12942 if the shared state contains a deferred function. (Not implemented 12943 yet) 12944 </p> 12945<p> 12946 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code> 12947 if the shared state is ready. 12948 </p> 12949<p> 12950 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code> 12951 if the function is returning because the absolute timeout specified 12952 by <code class="computeroutput"><span class="identifier">absl_time</span></code> 12953 has reached. 12954 </p> 12955</dd> 12956<dt><span class="term">Throws:</span></dt> 12957<dd> 12958<p> 12959 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 12960 is not associated with a shared state. 12961 </p> 12962<p> 12963 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 12964 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 12965 of the call, and the current thread is interrupted. 12966 </p> 12967<p> 12968 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 12969 if such a callback is called. 12970 </p> 12971</dd> 12972<dt><span class="term">Postconditions:</span></dt> 12973<dd><p> 12974 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>, 12975 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 12976 returns <code class="computeroutput"><span class="keyword">true</span></code> and 12977 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 12978 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 12979 </p></dd> 12980<dt><span class="term">Notes:</span></dt> 12981<dd><p> 12982 <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code> 12983 is an <span class="emphasis"><em>interruption point</em></span>. 12984 </p></dd> 12985</dl> 12986</div> 12987</div> 12988<div class="section"> 12989<div class="titlepage"><div><div><h6 class="title"> 12990<a name="thread.synchronization.futures.reference.unique_future.valid"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.valid" title="Member function valid()">Member 12991 function <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span></code></a> 12992</h6></div></div></div> 12993<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 12994</pre> 12995<div class="variablelist"> 12996<p class="title"><b></b></p> 12997<dl class="variablelist"> 12998<dt><span class="term">Returns:</span></dt> 12999<dd><p> 13000 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13001 is associated with a shared state, <code class="computeroutput"><span class="keyword">false</span></code> 13002 otherwise. 13003 </p></dd> 13004<dt><span class="term">Remarks:</span></dt> 13005<dd><p> 13006 The result of this function is not stable and that the future 13007 could become invalid even if the function returned true or vice-versa. 13008 </p></dd> 13009<dt><span class="term">Throws:</span></dt> 13010<dd><p> 13011 Nothing. 13012 </p></dd> 13013</dl> 13014</div> 13015</div> 13016<div class="section"> 13017<div class="titlepage"><div><div><h6 class="title"> 13018<a name="thread.synchronization.futures.reference.unique_future.is_ready"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION">Member 13019 function <code class="computeroutput"><span class="identifier">is_ready</span><span class="special">()</span></code> 13020 EXTENSION</a> 13021</h6></div></div></div> 13022<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13023</pre> 13024<div class="variablelist"> 13025<p class="title"><b></b></p> 13026<dl class="variablelist"> 13027<dt><span class="term">Returns:</span></dt> 13028<dd><p> 13029 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13030 is associated with a shared state and that result is ready for 13031 retrieval, <code class="computeroutput"><span class="keyword">false</span></code> 13032 otherwise. 13033 </p></dd> 13034<dt><span class="term">Remarks:</span></dt> 13035<dd><p> 13036 The result of this function is not stable and that the future 13037 could become not ready even if the function returned true or 13038 vice-versa. 13039 </p></dd> 13040<dt><span class="term">Throws:</span></dt> 13041<dd><p> 13042 Nothing. 13043 </p></dd> 13044</dl> 13045</div> 13046</div> 13047<div class="section"> 13048<div class="titlepage"><div><div><h6 class="title"> 13049<a name="thread.synchronization.futures.reference.unique_future.has_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_value" title="Member function has_value() EXTENSION">Member 13050 function <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> 13051 EXTENSION</a> 13052</h6></div></div></div> 13053<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13054</pre> 13055<div class="variablelist"> 13056<p class="title"><b></b></p> 13057<dl class="variablelist"> 13058<dt><span class="term">Returns:</span></dt> 13059<dd><p> 13060 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13061 is associated with a shared state, that result is ready for retrieval, 13062 and the result is a stored value, <code class="computeroutput"><span class="keyword">false</span></code> 13063 otherwise. 13064 </p></dd> 13065<dt><span class="term">Remarks:</span></dt> 13066<dd><p> 13067 The result of this function is not stable and the future could 13068 lost its value even if the function returned true or vice-versa. 13069 </p></dd> 13070<dt><span class="term">Throws:</span></dt> 13071<dd><p> 13072 Nothing. 13073 </p></dd> 13074</dl> 13075</div> 13076</div> 13077<div class="section"> 13078<div class="titlepage"><div><div><h6 class="title"> 13079<a name="thread.synchronization.futures.reference.unique_future.has_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_exception" title="Member function has_exception() EXTENSION">Member 13080 function <code class="computeroutput"><span class="identifier">has_exception</span><span class="special">()</span></code> EXTENSION</a> 13081</h6></div></div></div> 13082<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13083</pre> 13084<div class="variablelist"> 13085<p class="title"><b></b></p> 13086<dl class="variablelist"> 13087<dt><span class="term">Returns:</span></dt> 13088<dd><p> 13089 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13090 is associated with a shared state, that result is ready for retrieval, 13091 and the result is a stored exception, <code class="computeroutput"><span class="keyword">false</span></code> 13092 otherwise. 13093 </p></dd> 13094<dt><span class="term">Remarks:</span></dt> 13095<dd><p> 13096 The result of this function is not stable and the future could 13097 lost its exception even if the function returned true or vice-versa. 13098 </p></dd> 13099<dt><span class="term">Throws:</span></dt> 13100<dd><p> 13101 Nothing. 13102 </p></dd> 13103</dl> 13104</div> 13105</div> 13106<div class="section"> 13107<div class="titlepage"><div><div><h6 class="title"> 13108<a name="thread.synchronization.futures.reference.unique_future.get_exception_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_exception_ptr" title="Member function get_exception_ptr() EXTENSION">Member 13109 function <code class="computeroutput"><span class="identifier">get_exception_ptr</span><span class="special">()</span></code> EXTENSION</a> 13110</h6></div></div></div> 13111<pre class="programlisting"><span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> 13112</pre> 13113<div class="variablelist"> 13114<p class="title"><b></b></p> 13115<dl class="variablelist"> 13116<dt><span class="term">Effects:</span></dt> 13117<dd><p> 13118 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13119 is associated with a shared state, waits until the result is 13120 ready. If the result is not ready on entry, and the result has 13121 a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked 13122 prior to waiting. 13123 </p></dd> 13124<dt><span class="term">Returns:</span></dt> 13125<dd><p> 13126 an exception_ptr, storing or not an exception. 13127 </p></dd> 13128<dt><span class="term">Remarks:</span></dt> 13129<dd><p> 13130 The result of this function is not stable and the future could 13131 lost its exception even if the function returned a valid <code class="computeroutput"><span class="identifier">exception_ptr</span></code> or vice-versa. 13132 </p></dd> 13133<dt><span class="term">Throws:</span></dt> 13134<dd><p> 13135 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw. 13136 </p></dd> 13137</dl> 13138</div> 13139</div> 13140<div class="section"> 13141<div class="titlepage"><div><div><h6 class="title"> 13142<a name="thread.synchronization.futures.reference.unique_future.get_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION">Member 13143 function <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code> 13144 EXTENSION</a> 13145</h6></div></div></div> 13146<pre class="programlisting"><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">();</span> 13147</pre> 13148<div class="variablelist"> 13149<p class="title"><b></b></p> 13150<dl class="variablelist"> 13151<dt><span class="term">Effects:</span></dt> 13152<dd><p> 13153 Determine the state of the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 13154 if any. 13155 </p></dd> 13156<dt><span class="term">Returns:</span></dt> 13157<dd><p> 13158 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13159 is not associated with a shared state. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a> if the shared 13160 state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready for retrieval, 13161 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">waiting</span></code></a> otherwise. 13162 </p></dd> 13163<dt><span class="term">Remarks:</span></dt> 13164<dd><p> 13165 The result of this function is not stable. 13166 </p></dd> 13167<dt><span class="term">Throws:</span></dt> 13168<dd><p> 13169 Nothing. 13170 </p></dd> 13171</dl> 13172</div> 13173</div> 13174<div class="section"> 13175<div class="titlepage"><div><div><h6 class="title"> 13176<a name="thread.synchronization.futures.reference.unique_future.share"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.share" title="Member function share()">Member 13177 function <code class="computeroutput"><span class="identifier">share</span><span class="special">()</span></code></a> 13178</h6></div></div></div> 13179<pre class="programlisting"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">share</span><span class="special">();</span> 13180</pre> 13181<div class="variablelist"> 13182<p class="title"><b></b></p> 13183<dl class="variablelist"> 13184<dt><span class="term">Returns:</span></dt> 13185<dd><p> 13186 <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</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="keyword">this</span><span class="special">))</span></code>. 13187 </p></dd> 13188<dt><span class="term">Postconditions:</span></dt> 13189<dd><p> 13190 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">valid</span><span class="special">()</span> 13191 <span class="special">==</span> <span class="keyword">false</span></code>. 13192 </p></dd> 13193</dl> 13194</div> 13195</div> 13196<div class="section"> 13197<div class="titlepage"><div><div><h6 class="title"> 13198<a name="thread.synchronization.futures.reference.unique_future.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.then" title="Member function then() - EXTENSION">Member 13199 function <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code> 13200 - EXTENSION</a> 13201</h6></div></div></div> 13202<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> 13203 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 13204<span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 13205<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Ex</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 13206 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 13207<span class="identifier">then</span><span class="special">(</span><span class="identifier">Ex</span><span class="special">&</span> <span class="identifier">executor</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 13208<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 13209 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 13210<span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 13211</pre> 13212<div class="warning"><table border="0" summary="Warning"> 13213<tr> 13214<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 13215<th align="left">Warning</th> 13216</tr> 13217<tr><td align="left" valign="top"><p> 13218 These functions are experimental and subject to change in future 13219 versions. There are not too much tests yet, so it is possible that 13220 you can find out some trivial bugs :( 13221 </p></td></tr> 13222</table></div> 13223<div class="note"><table border="0" summary="Note"> 13224<tr> 13225<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 13226<th align="left">Note</th> 13227</tr> 13228<tr><td align="left" valign="top"><p> 13229 These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future<T> and related 13230 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg, 13231 H. Sutter, S. Mithani. 13232 </p></td></tr> 13233</table></div> 13234<div class="variablelist"> 13235<p class="title"><b></b></p> 13236<dl class="variablelist"> 13237<dt><span class="term">Notes:</span></dt> 13238<dd><p> 13239 The three functions differ only by input parameters. The first 13240 only takes a callable object which accepts a future object as 13241 a parameter. The second function takes an executor as the first 13242 parameter and a callable object as the second parameter. The 13243 third function takes a launch policy as the first parameter and 13244 a callable object as the second parameter. 13245 </p></dd> 13246<dt><span class="term">Requires:</span></dt> 13247<dd><p> 13248 <code class="computeroutput"><span class="identifier">INVOKE</span><span class="special">(</span><span class="identifier">DECAY_COPY</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">func</span><span class="special">)),</span> 13249 <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span></code> 13250 shall be a valid expression. 13251 </p></dd> 13252<dt><span class="term">Effects:</span></dt> 13253<dd> 13254<p> 13255 All the functions create a shared state that is associated with 13256 the returned future object. Additionally, 13257 </p> 13258<p> 13259 - When the object's shared state is ready, the continuation 13260 <code class="computeroutput"><span class="identifier">INVOKE</span><span class="special">(</span><span class="identifier">DECAY_COPY</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">func</span><span class="special">)),</span> 13261 <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span></code> 13262 is called depending on the overload (see below) with the call 13263 to DECAY_COPY() being evaluated in the thread that called then. 13264 </p> 13265<p> 13266 - Any value returned from the continuation is stored as the result 13267 in the shared state of the resulting <code class="computeroutput"><span class="identifier">future</span></code>. 13268 Any exception propagated from the execution of the continuation 13269 is stored as the exceptional result in the shared state of the 13270 resulting <code class="computeroutput"><span class="identifier">future</span></code>. 13271 </p> 13272<p> 13273 The continuation launches according to the specified policy or 13274 executor or noting. 13275 </p> 13276<p> 13277 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">none</span></code> 13278 the continuation is called on an unspecified thread of execution. 13279 </p> 13280<p> 13281 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> 13282 the continuation is called on a new thread of execution. 13283 </p> 13284<p> 13285 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> 13286 the continuation is called on demand. 13287 </p> 13288<p> 13289 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">executor</span></code> 13290 the continuation is called on one of the thread of execution 13291 of the executor. 13292 </p> 13293<p> 13294 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">inherit</span></code> 13295 the continuation inherits the parent's launch policy or executor. 13296 </p> 13297<p> 13298 - When the executor or launch policy is not provided (first overload) 13299 is if as if launch::none was specified. 13300 </p> 13301<p> 13302 - When the executor is provided (second overload) the continuation 13303 is called on one of the thread of execution of the executor. 13304 </p> 13305<p> 13306 - If the parent has a policy of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> 13307 and the continuation does not have a specified launch policy 13308 executor, then the parent is filled by immediately calling <code class="computeroutput"><span class="special">.</span><span class="identifier">wait</span><span class="special">()</span></code>, and the policy of the antecedent 13309 is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>. 13310 </p> 13311</dd> 13312<dt><span class="term">Returns:</span></dt> 13313<dd><p> 13314 An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">)></span></code> 13315 that refers to the shared state created by the continuation. 13316 </p></dd> 13317<dt><span class="term">Notes:</span></dt> 13318<dd> 13319<p> 13320 - Note that nested futures are not implicitly unwrapped yet. 13321 This could be subject to change in future versions. 13322 </p> 13323<p> 13324 - The returned futures behave as the ones returned from boost::async, 13325 the destructor of the future object returned from then will block. 13326 This could be subject to change in future versions. 13327 </p> 13328</dd> 13329<dt><span class="term">Postconditions:</span></dt> 13330<dd> 13331<p> 13332 - The <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a></code> object 13333 passed to the parameter of the continuation function is a copy 13334 of the original <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a></code>. 13335 </p> 13336<p> 13337 - <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> 13338 <span class="special">==</span> <span class="keyword">false</span></code> 13339 on original future; <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span> 13340 <span class="keyword">true</span></code> on the <code class="computeroutput"><span class="identifier">future</span></code> returned from then. 13341 </p> 13342</dd> 13343</dl> 13344</div> 13345</div> 13346<div class="section"> 13347<div class="titlepage"><div><div><h6 class="title"> 13348<a name="thread.synchronization.futures.reference.unique_future.unwrap"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.unwrap" title="Member function unwrap() EXTENSION">Member 13349 function <code class="computeroutput"><span class="identifier">unwrap</span><span class="special">()</span></code> 13350 EXTENSION</a> 13351</h6></div></div></div> 13352<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R2</span><span class="special">></span> 13353 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R2</span><span class="special">></span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R2</span><span class="special">>>::</span><span class="identifier">unwrap</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 13354<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R2</span><span class="special">></span> 13355 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a><span class="special"><</span><span class="identifier">R2</span><span class="special">></span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a><span class="special"><</span><span class="identifier">R2</span><span class="special">>>::</span><span class="identifier">unwrap</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 13356</pre> 13357<div class="warning"><table border="0" summary="Warning"> 13358<tr> 13359<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 13360<th align="left">Warning</th> 13361</tr> 13362<tr><td align="left" valign="top"><p> 13363 These functions are experimental and subject to change in future 13364 versions. There are not too much tests yet, so it is possible that 13365 you can find out some trivial bugs :( 13366 </p></td></tr> 13367</table></div> 13368<div class="note"><table border="0" summary="Note"> 13369<tr> 13370<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 13371<th align="left">Note</th> 13372</tr> 13373<tr><td align="left" valign="top"><p> 13374 These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future<T> and related 13375 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg, 13376 H. Sutter, S. Mithani. 13377 </p></td></tr> 13378</table></div> 13379<div class="variablelist"> 13380<p class="title"><b></b></p> 13381<dl class="variablelist"> 13382<dt><span class="term">Notes:</span></dt> 13383<dd><p> 13384 Removes the outermost future and returns a future with the associated 13385 state been a proxy of the outer future. 13386 </p></dd> 13387<dt><span class="term">Effects:</span></dt> 13388<dd><p> 13389 - Returns a future that becomes ready when the shared state of 13390 the outer and inner future is ready. The validity of the future 13391 returned from <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> applied on the outer future 13392 cannot be established a priori. If it is not valid, this future 13393 is forced to be valid and becomes ready with an exception of 13394 type <code class="computeroutput"><span class="identifier">future_error</span></code>, 13395 with an error code of <code class="computeroutput"><span class="identifier">future_errc</span><span class="special">::</span><span class="identifier">broken_promise</span></code>. 13396 </p></dd> 13397<dt><span class="term">Returns:</span></dt> 13398<dd><p> 13399 An object of type future with the associated state been a proxy 13400 of outer future. 13401 </p></dd> 13402<dt><span class="term">Postconditions:</span></dt> 13403<dd><p> 13404 - The returned future has <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span> 13405 <span class="keyword">true</span></code>. 13406 </p></dd> 13407</dl> 13408</div> 13409</div> 13410</div> 13411<div class="section"> 13412<div class="titlepage"><div><div><h5 class="title"> 13413<a name="thread.synchronization.futures.reference.shared_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">shared_future</span></code> class template</a> 13414</h5></div></div></div> 13415<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span> 13416<span class="keyword">class</span> <span class="identifier">shared_future</span> 13417<span class="special">{</span> 13418<span class="keyword">public</span><span class="special">:</span> 13419 <span class="keyword">typedef</span> <span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">state</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13420 <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13421 13422 <span class="identifier">shared_future</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 13423 <span class="special">~</span><span class="identifier">shared_future</span><span class="special">();</span> 13424 13425 <span class="comment">// copy support</span> 13426 <span class="identifier">shared_future</span><span class="special">(</span><span class="identifier">shared_future</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span> 13427 <span class="identifier">shared_future</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_future</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span> 13428 13429 <span class="comment">// move support</span> 13430 <span class="identifier">shared_future</span><span class="special">(</span><span class="identifier">shared_future</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 13431 <span class="identifier">shared_future</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 13432 <span class="identifier">shared_future</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_future</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 13433 <span class="identifier">shared_future</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 13434 13435 <span class="comment">// factories</span> 13436 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 13437 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 13438 <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13439 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 13440 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 13441 <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13442 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 13443 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 13444 <span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13445 13446 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">&</span> <span class="identifier">other</span><span class="special">);</span> 13447 13448 <span class="comment">// retrieving the value</span> 13449 <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13450 13451 <span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 13452 13453 <span class="comment">// functions to check state, and wait for ready</span> 13454 <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 13455 <span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13456 <span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13457 <span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13458 13459 <span class="comment">// waiting for the result to be ready</span> 13460 <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13461 <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> 13462 <span class="identifier">future_status</span> <span class="identifier">wait_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">const</span><span class="special">;</span> 13463 <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> 13464 <span class="identifier">future_status</span> <span class="identifier">wait_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">const</span><span class="special">;</span> 13465 13466<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span> 13467 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">></span> 13468 <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// DEPRECATED SINCE V3.0.0</span> 13469 <span class="keyword">bool</span> <span class="identifier">timed_wait_until</span><span class="special">(</span><span class="identifier">boost</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="keyword">const</span><span class="special">;</span> <span class="comment">// DEPRECATED SINCE V3.0.0</span> 13470<span class="preprocessor">#endif</span> 13471 <span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 13472 13473<span class="special">};</span> 13474</pre> 13475<div class="section"> 13476<div class="titlepage"><div><div><h6 class="title"> 13477<a name="thread.synchronization.futures.reference.shared_future.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.default_constructor" title="Default Constructor">Default 13478 Constructor</a> 13479</h6></div></div></div> 13480<pre class="programlisting"><span class="identifier">shared_future</span><span class="special">();</span> 13481</pre> 13482<div class="variablelist"> 13483<p class="title"><b></b></p> 13484<dl class="variablelist"> 13485<dt><span class="term">Effects:</span></dt> 13486<dd><p> 13487 Constructs an uninitialized shared_future. 13488 </p></dd> 13489<dt><span class="term">Postconditions:</span></dt> 13490<dd><p> 13491 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span></code></a> returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 13492 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. 13493 </p></dd> 13494<dt><span class="term">Throws:</span></dt> 13495<dd><p> 13496 Nothing. 13497 </p></dd> 13498</dl> 13499</div> 13500</div> 13501<div class="section"> 13502<div class="titlepage"><div><div><h6 class="title"> 13503<a name="thread.synchronization.futures.reference.shared_future.get"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()">Member 13504 function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a> 13505</h6></div></div></div> 13506<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13507<span class="identifier">R</span><span class="special">&</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13508<span class="keyword">void</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13509</pre> 13510<div class="variablelist"> 13511<p class="title"><b></b></p> 13512<dl class="variablelist"> 13513<dt><span class="term">Effects:</span></dt> 13514<dd><p> 13515 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13516 is associated with a shared state, waits until the result is 13517 ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">wait</span><span class="special">()</span></code></a>, 13518 and returns a <code class="computeroutput"><span class="keyword">const</span></code> 13519 reference to the result. 13520 </p></dd> 13521<dt><span class="term">Returns:</span></dt> 13522<dd> 13523<p> 13524 - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">get</span><span class="special">()</span></code> return the stored reference. 13525 </p> 13526<p> 13527 - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code>, there is no return value. 13528 </p> 13529<p> 13530 - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">get</span><span class="special">()</span></code> returns a <code class="computeroutput"><span class="keyword">const</span></code> 13531 reference to the value stored in the shared state. 13532 </p> 13533</dd> 13534<dt><span class="term">Throws:</span></dt> 13535<dd> 13536<p> 13537 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13538 is not associated with a shared state. 13539 </p> 13540<p> 13541 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 13542 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 13543 of the call, and the current thread is interrupted. 13544 </p> 13545</dd> 13546<dt><span class="term">Notes:</span></dt> 13547<dd><p> 13548 <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> 13549 is an <span class="emphasis"><em>interruption point</em></span>. 13550 </p></dd> 13551</dl> 13552</div> 13553</div> 13554<div class="section"> 13555<div class="titlepage"><div><div><h6 class="title"> 13556<a name="thread.synchronization.futures.reference.shared_future.wait"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait" title="Member function wait()">Member 13557 function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a> 13558</h6></div></div></div> 13559<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13560</pre> 13561<div class="variablelist"> 13562<p class="title"><b></b></p> 13563<dl class="variablelist"> 13564<dt><span class="term">Effects:</span></dt> 13565<dd><p> 13566 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13567 is associated with a shared state, waits until the result is 13568 ready. If the result is not ready on entry, and the result has 13569 a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked 13570 prior to waiting. 13571 </p></dd> 13572<dt><span class="term">Throws:</span></dt> 13573<dd> 13574<p> 13575 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13576 is not associated with a shared state. 13577 </p> 13578<p> 13579 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 13580 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 13581 of the call, and the current thread is interrupted. 13582 </p> 13583<p> 13584 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 13585 if such a callback is called. 13586 </p> 13587</dd> 13588<dt><span class="term">Postconditions:</span></dt> 13589<dd><p> 13590 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 13591 returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 13592 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 13593 </p></dd> 13594<dt><span class="term">Notes:</span></dt> 13595<dd><p> 13596 <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> 13597 is an <span class="emphasis"><em>interruption point</em></span>. 13598 </p></dd> 13599</dl> 13600</div> 13601</div> 13602<div class="section"> 13603<div class="titlepage"><div><div><h6 class="title"> 13604<a name="thread.synchronization.futures.reference.shared_future.timed_wait_duration"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.timed_wait_duration" title="Member function timed_wait()">Member 13605 function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code></a> 13606</h6></div></div></div> 13607<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">></span> 13608<span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">wait_duration</span><span class="special">);</span> 13609</pre> 13610<div class="variablelist"> 13611<p class="title"><b></b></p> 13612<dl class="variablelist"> 13613<dt><span class="term">Effects:</span></dt> 13614<dd><p> 13615 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13616 is associated with a shared state, waits until the result is 13617 ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code> 13618 has elapsed. If the result is not ready on entry, and the result 13619 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is 13620 invoked prior to waiting. 13621 </p></dd> 13622<dt><span class="term">Returns:</span></dt> 13623<dd><p> 13624 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13625 is associated with a shared state, and that result is ready before 13626 the specified time has elapsed, <code class="computeroutput"><span class="keyword">false</span></code> 13627 otherwise. 13628 </p></dd> 13629<dt><span class="term">Throws:</span></dt> 13630<dd> 13631<p> 13632 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13633 is not associated with a shared state. 13634 </p> 13635<p> 13636 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 13637 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 13638 of the call, and the current thread is interrupted. 13639 </p> 13640<p> 13641 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 13642 if such a callback is called. 13643 </p> 13644</dd> 13645<dt><span class="term">Postconditions:</span></dt> 13646<dd><p> 13647 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>, 13648 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 13649 returns <code class="computeroutput"><span class="keyword">true</span></code> and 13650 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 13651 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 13652 </p></dd> 13653<dt><span class="term">Notes:</span></dt> 13654<dd><p> 13655 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 13656 is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that 13657 meets the Boost.DateTime time duration requirements. 13658 </p></dd> 13659</dl> 13660</div> 13661</div> 13662<div class="section"> 13663<div class="titlepage"><div><div><h6 class="title"> 13664<a name="thread.synchronization.futures.reference.shared_future.timed_wait_absolute"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.timed_wait_absolute" title="Member function timed_wait()">Member 13665 function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code></a> 13666</h6></div></div></div> 13667<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">wait_timeout</span><span class="special">);</span> 13668</pre> 13669<div class="variablelist"> 13670<p class="title"><b></b></p> 13671<dl class="variablelist"> 13672<dt><span class="term">Effects:</span></dt> 13673<dd><p> 13674 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13675 is associated with a shared state, waits until the result is 13676 ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code> 13677 has passed. If the result is not ready on entry, and the result 13678 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is 13679 invoked prior to waiting. 13680 </p></dd> 13681<dt><span class="term">Returns:</span></dt> 13682<dd><p> 13683 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13684 is associated with a shared state, and that result is ready before 13685 the specified time has passed, <code class="computeroutput"><span class="keyword">false</span></code> 13686 otherwise. 13687 </p></dd> 13688<dt><span class="term">Throws:</span></dt> 13689<dd> 13690<p> 13691 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13692 is not associated with a shared state. 13693 </p> 13694<p> 13695 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 13696 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 13697 of the call, and the current thread is interrupted. 13698 </p> 13699<p> 13700 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 13701 if such a callback is called. 13702 </p> 13703</dd> 13704<dt><span class="term">Postconditions:</span></dt> 13705<dd><p> 13706 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>, 13707 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 13708 returns <code class="computeroutput"><span class="keyword">true</span></code> and 13709 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 13710 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 13711 </p></dd> 13712<dt><span class="term">Notes:</span></dt> 13713<dd><p> 13714 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 13715 is an <span class="emphasis"><em>interruption point</em></span>. 13716 </p></dd> 13717</dl> 13718</div> 13719</div> 13720<div class="section"> 13721<div class="titlepage"><div><div><h6 class="title"> 13722<a name="thread.synchronization.futures.reference.shared_future.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait_for" title="Member function wait_for()">Member 13723 function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code></a> 13724</h6></div></div></div> 13725<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> 13726<span class="identifier">future_status</span> <span class="identifier">wait_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">const</span><span class="special">;</span> 13727</pre> 13728<div class="variablelist"> 13729<p class="title"><b></b></p> 13730<dl class="variablelist"> 13731<dt><span class="term">Effects:</span></dt> 13732<dd><p> 13733 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13734 is associated with a shared state, waits until the result is 13735 ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code> 13736 has elapsed. If the result is not ready on entry, and the result 13737 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is 13738 invoked prior to waiting. 13739 </p></dd> 13740<dt><span class="term">Returns:</span></dt> 13741<dd> 13742<p> 13743 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code> 13744 if the shared state contains a deferred function. (Not implemented 13745 yet) 13746 </p> 13747<p> 13748 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code> 13749 if the shared state is ready. 13750 </p> 13751<p> 13752 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code> 13753 if the function is returning because the relative timeout specified 13754 by <code class="computeroutput"><span class="identifier">rel_time</span></code> has 13755 expired. 13756 </p> 13757</dd> 13758<dt><span class="term">Throws:</span></dt> 13759<dd> 13760<p> 13761 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13762 is not associated with a shared state. 13763 </p> 13764<p> 13765 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 13766 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 13767 of the call, and the current thread is interrupted. 13768 </p> 13769<p> 13770 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 13771 if such a callback is called. 13772 </p> 13773</dd> 13774<dt><span class="term">Postconditions:</span></dt> 13775<dd><p> 13776 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>, 13777 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 13778 returns <code class="computeroutput"><span class="keyword">true</span></code> and 13779 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 13780 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 13781 </p></dd> 13782<dt><span class="term">Notes:</span></dt> 13783<dd><p> 13784 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 13785 is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that 13786 meets the Boost.DateTime time duration requirements. 13787 </p></dd> 13788</dl> 13789</div> 13790</div> 13791<div class="section"> 13792<div class="titlepage"><div><div><h6 class="title"> 13793<a name="thread.synchronization.futures.reference.shared_future.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait_until" title="Member function wait_until()">Member 13794 function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a> 13795</h6></div></div></div> 13796<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> 13797<span class="identifier">future_status</span> <span class="identifier">wait_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">const</span><span class="special">;</span> 13798</pre> 13799<div class="variablelist"> 13800<p class="title"><b></b></p> 13801<dl class="variablelist"> 13802<dt><span class="term">Effects:</span></dt> 13803<dd><p> 13804 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13805 is associated with a shared state, waits until the result is 13806 ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code> 13807 has passed. If the result is not ready on entry, and the result 13808 has a <span class="emphasis"><em>wait callback</em></span> set, that callback is 13809 invoked prior to waiting. 13810 </p></dd> 13811<dt><span class="term">Returns:</span></dt> 13812<dd> 13813<p> 13814 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code> 13815 if the shared state contains a deferred function. (Not implemented 13816 yet) 13817 </p> 13818<p> 13819 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code> 13820 if the shared state is ready. 13821 </p> 13822<p> 13823 - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code> 13824 if the function is returning because the absolute timeout specified 13825 by <code class="computeroutput"><span class="identifier">absl_time</span></code> 13826 has reached. 13827 </p> 13828</dd> 13829<dt><span class="term">Throws:</span></dt> 13830<dd> 13831<p> 13832 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13833 is not associated with a shared state. 13834 </p> 13835<p> 13836 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result 13837 associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point 13838 of the call, and the current thread is interrupted. 13839 </p> 13840<p> 13841 - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span> 13842 if such a callback is called. 13843 </p> 13844</dd> 13845<dt><span class="term">Postconditions:</span></dt> 13846<dd><p> 13847 If this call returned <code class="computeroutput"><span class="keyword">true</span></code>, 13848 then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">is_ready</span><span class="special">()</span></code></a> 13849 returns <code class="computeroutput"><span class="keyword">true</span></code> and 13850 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_state</span><span class="special">()</span></code></a> 13851 returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>. 13852 </p></dd> 13853<dt><span class="term">Notes:</span></dt> 13854<dd><p> 13855 <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code> 13856 is an <span class="emphasis"><em>interruption point</em></span>. 13857 </p></dd> 13858</dl> 13859</div> 13860</div> 13861<div class="section"> 13862<div class="titlepage"><div><div><h6 class="title"> 13863<a name="thread.synchronization.futures.reference.shared_future.valid"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.valid" title="Member function valid()">Member 13864 function <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span></code></a> 13865</h6></div></div></div> 13866<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 13867</pre> 13868<div class="variablelist"> 13869<p class="title"><b></b></p> 13870<dl class="variablelist"> 13871<dt><span class="term">Returns:</span></dt> 13872<dd><p> 13873 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13874 is associated with a shared state, <code class="computeroutput"><span class="keyword">false</span></code> 13875 otherwise. 13876 </p></dd> 13877<dt><span class="term">Throws:</span></dt> 13878<dd><p> 13879 Nothing. 13880 </p></dd> 13881</dl> 13882</div> 13883</div> 13884<div class="section"> 13885<div class="titlepage"><div><div><h6 class="title"> 13886<a name="thread.synchronization.futures.reference.shared_future.is_ready"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION">Member 13887 function <code class="computeroutput"><span class="identifier">is_ready</span><span class="special">()</span></code> 13888 EXTENSION</a> 13889</h6></div></div></div> 13890<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13891</pre> 13892<div class="variablelist"> 13893<p class="title"><b></b></p> 13894<dl class="variablelist"> 13895<dt><span class="term">Returns:</span></dt> 13896<dd><p> 13897 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13898 is associated with a shared state, and that result is ready for 13899 retrieval, <code class="computeroutput"><span class="keyword">false</span></code> 13900 otherwise. 13901 </p></dd> 13902<dt><span class="term">Throws:</span></dt> 13903<dd><p> 13904 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw. 13905 </p></dd> 13906</dl> 13907</div> 13908</div> 13909<div class="section"> 13910<div class="titlepage"><div><div><h6 class="title"> 13911<a name="thread.synchronization.futures.reference.shared_future.has_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_value" title="Member function has_value() EXTENSION">Member 13912 function <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> 13913 EXTENSION</a> 13914</h6></div></div></div> 13915<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13916</pre> 13917<div class="variablelist"> 13918<p class="title"><b></b></p> 13919<dl class="variablelist"> 13920<dt><span class="term">Returns:</span></dt> 13921<dd><p> 13922 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13923 is associated with a shared state, that result is ready for retrieval, 13924 and the result is a stored value, <code class="computeroutput"><span class="keyword">false</span></code> 13925 otherwise. 13926 </p></dd> 13927<dt><span class="term">Throws:</span></dt> 13928<dd><p> 13929 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw. 13930 </p></dd> 13931</dl> 13932</div> 13933</div> 13934<div class="section"> 13935<div class="titlepage"><div><div><h6 class="title"> 13936<a name="thread.synchronization.futures.reference.shared_future.has_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_exception" title="Member function has_exception() EXTENSION">Member 13937 function <code class="computeroutput"><span class="identifier">has_exception</span><span class="special">()</span></code> EXTENSION</a> 13938</h6></div></div></div> 13939<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 13940</pre> 13941<div class="variablelist"> 13942<p class="title"><b></b></p> 13943<dl class="variablelist"> 13944<dt><span class="term">Returns:</span></dt> 13945<dd><p> 13946 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13947 is associated with a shared state, that result is ready for retrieval, 13948 and the result is a stored exception, <code class="computeroutput"><span class="keyword">false</span></code> 13949 otherwise. 13950 </p></dd> 13951<dt><span class="term">Throws:</span></dt> 13952<dd><p> 13953 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw. 13954 </p></dd> 13955</dl> 13956</div> 13957</div> 13958<div class="section"> 13959<div class="titlepage"><div><div><h6 class="title"> 13960<a name="thread.synchronization.futures.reference.shared_future.get_exception_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_exception_ptr" title="Member function get_exception_ptr() EXTENSION">Member 13961 function <code class="computeroutput"><span class="identifier">get_exception_ptr</span><span class="special">()</span></code> EXTENSION</a> 13962</h6></div></div></div> 13963<pre class="programlisting"><span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> 13964</pre> 13965<div class="variablelist"> 13966<p class="title"><b></b></p> 13967<dl class="variablelist"> 13968<dt><span class="term">Effects:</span></dt> 13969<dd><p> 13970 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 13971 is associated with a shared state, waits until the result is 13972 ready. If the result is not ready on entry, and the result has 13973 a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked 13974 prior to waiting. 13975 </p></dd> 13976<dt><span class="term">Returns:</span></dt> 13977<dd><p> 13978 an exception_ptr, storing or not an exception. 13979 </p></dd> 13980<dt><span class="term">Throws:</span></dt> 13981<dd><p> 13982 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw. 13983 </p></dd> 13984</dl> 13985</div> 13986</div> 13987<div class="section"> 13988<div class="titlepage"><div><div><h6 class="title"> 13989<a name="thread.synchronization.futures.reference.shared_future.get_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION">Member 13990 function <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code> 13991 EXTENSION</a> 13992</h6></div></div></div> 13993<pre class="programlisting"><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">();</span> 13994</pre> 13995<div class="variablelist"> 13996<p class="title"><b></b></p> 13997<dl class="variablelist"> 13998<dt><span class="term">Effects:</span></dt> 13999<dd><p> 14000 Determine the state of the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 14001 if any. 14002 </p></dd> 14003<dt><span class="term">Returns:</span></dt> 14004<dd><p> 14005 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14006 is not associated with a shared state. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a> if the shared 14007 state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready for retrieval, 14008 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">waiting</span></code></a> otherwise. 14009 </p></dd> 14010<dt><span class="term">Throws:</span></dt> 14011<dd><p> 14012 Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw. 14013 </p></dd> 14014</dl> 14015</div> 14016</div> 14017<div class="section"> 14018<div class="titlepage"><div><div><h6 class="title"> 14019<a name="thread.synchronization.futures.reference.shared_future.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.then" title="Member function then() EXTENSION">Member 14020 function <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code> 14021 EXTENSION</a> 14022</h6></div></div></div> 14023<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> 14024 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 14025<span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 14026<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Ex</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 14027 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 14028<span class="identifier">then</span><span class="special">(</span><span class="identifier">Ex</span><span class="special">&</span> <span class="identifier">executor</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 14029<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 14030 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">></span> 14031<span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 14032</pre> 14033<div class="warning"><table border="0" summary="Warning"> 14034<tr> 14035<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 14036<th align="left">Warning</th> 14037</tr> 14038<tr><td align="left" valign="top"><p> 14039 These functions are experimental and subject to change in future 14040 versions. There are not too much tests yet, so it is possible that 14041 you can find out some trivial bugs :( 14042 </p></td></tr> 14043</table></div> 14044<div class="note"><table border="0" summary="Note"> 14045<tr> 14046<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 14047<th align="left">Note</th> 14048</tr> 14049<tr><td align="left" valign="top"><p> 14050 These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future<T> and related 14051 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg, 14052 H. Sutter, S. Mithani. 14053 </p></td></tr> 14054</table></div> 14055<div class="variablelist"> 14056<p class="title"><b></b></p> 14057<dl class="variablelist"> 14058<dt><span class="term">Notes:</span></dt> 14059<dd><p> 14060 The three functions differ only by input parameters. The first 14061 only takes a callable object which accepts a shared_future object 14062 as a parameter. The second function takes an executor as the 14063 first parameter and a callable object as the second parameter. 14064 The third function takes a launch policy as the first parameter 14065 and a callable object as the second parameter. 14066 </p></dd> 14067<dt><span class="term">Requires:</span></dt> 14068<dd><p> 14069 <code class="computeroutput"><span class="identifier">INVOKE</span><span class="special">(</span><span class="identifier">DECAY_COPY</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">func</span><span class="special">)),</span> 14070 <span class="special">*</span><span class="keyword">this</span><span class="special">)</span></code> shall be a valid expression. 14071 </p></dd> 14072<dt><span class="term">Effects:</span></dt> 14073<dd> 14074<p> 14075 All the functions create a shared state that is associated with 14076 the returned future object. Additionally, 14077 </p> 14078<p> 14079 - When the object's shared state is ready, the continuation 14080 <code class="computeroutput"><span class="identifier">INVOKE</span><span class="special">(</span><span class="identifier">DECAY_COPY</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">func</span><span class="special">)),</span> 14081 <span class="special">*</span><span class="keyword">this</span><span class="special">)</span></code> is called depending on the overload 14082 (see below) with the call to DECAY_COPY() being evaluated in 14083 the thread that called then. 14084 </p> 14085<p> 14086 - Any value returned from the continuation is stored as the result 14087 in the shared state of the resulting <code class="computeroutput"><span class="identifier">future</span></code>. 14088 Any exception propagated from the execution of the continuation 14089 is stored as the exceptional result in the shared state of the 14090 resulting <code class="computeroutput"><span class="identifier">future</span></code>. 14091 </p> 14092<p> 14093 The continuation launches according to the specified policy or 14094 executor or noting. 14095 </p> 14096<p> 14097 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">none</span></code> 14098 the continuation is called on an unspecified thread of execution. 14099 </p> 14100<p> 14101 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> 14102 the continuation is called on a new thread of execution. 14103 </p> 14104<p> 14105 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> 14106 the continuation is called on demand. 14107 </p> 14108<p> 14109 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">executor</span></code> 14110 the continuation is called on one of the thread of execution 14111 of the executor. 14112 </p> 14113<p> 14114 - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">inherit</span></code> 14115 the continuation inherits the parent's launch policy or executor. 14116 </p> 14117<p> 14118 - When the executor or launch policy is not provided (first overload) 14119 is if as if launch::none was specified. 14120 </p> 14121<p> 14122 - When the executor is provided (second overload) the continuation 14123 is called on one of the thread of execution of the executor. 14124 </p> 14125<p> 14126 - If the parent has a policy of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> 14127 and the continuation does not have a specified launch policy 14128 executor, then the parent is filled by immediately calling <code class="computeroutput"><span class="special">.</span><span class="identifier">wait</span><span class="special">()</span></code>, and the policy of the antecedent 14129 is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>. 14130 </p> 14131</dd> 14132<dt><span class="term">Returns:</span></dt> 14133<dd><p> 14134 An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)></span></code> that refers to the shared 14135 state created by the continuation. 14136 </p></dd> 14137<dt><span class="term">Notes:</span></dt> 14138<dd> 14139<p> 14140 - Note that nested futures are not implicitly unwrapped yet. 14141 This could be subject to change in future versions. 14142 </p> 14143<p> 14144 - The returned futures behave as the ones returned from boost::async, 14145 the destructor of the future object returned from then will block. 14146 This could be subject to change in future versions. 14147 </p> 14148</dd> 14149<dt><span class="term">Postconditions:</span></dt> 14150<dd> 14151<p> 14152 - The future object is moved to the parameter of the continuation 14153 function . 14154 </p> 14155<p> 14156 - <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> 14157 <span class="special">==</span> <span class="keyword">true</span></code> 14158 on original <code class="computeroutput"><span class="identifier">shared_future</span></code>; 14159 <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> 14160 <span class="special">==</span> <span class="keyword">true</span></code> 14161 on the <code class="computeroutput"><span class="identifier">future</span></code> 14162 returned from then. 14163 </p> 14164</dd> 14165</dl> 14166</div> 14167</div> 14168</div> 14169<div class="section"> 14170<div class="titlepage"><div><div><h5 class="title"> 14171<a name="thread.synchronization.futures.reference.promise"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">promise</span></code> class template</a> 14172</h5></div></div></div> 14173<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span> 14174<span class="keyword">class</span> <span class="identifier">promise</span> 14175<span class="special">{</span> 14176<span class="keyword">public</span><span class="special">:</span> 14177 <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span> 14178 14179 <span class="identifier">promise</span><span class="special">();</span> 14180 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span> 14181 <span class="identifier">promise</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">);</span> 14182 <span class="identifier">promise</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 14183 <span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 14184 <span class="special">~</span><span class="identifier">promise</span><span class="special">();</span> 14185 14186 <span class="comment">// Move support</span> 14187 <span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;;</span> 14188 <span class="identifier">promise</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span><span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;;</span> 14189 14190 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">promise</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 14191 <span class="comment">// Result retrieval</span> 14192 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">get_future</span><span class="special">();</span> 14193 14194 <span class="comment">// Set the value</span> 14195 <span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span> 14196 <span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span> 14197 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 14198 <span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14199 14200 <span class="comment">// setting the result with deferred notification</span> 14201 <span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span> 14202 <span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">p</span><span class="special">);</span> 14203 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 14204 <span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">p</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14205 14206 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 14207 <span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14208 14209 <span class="keyword">void</span> <span class="identifier">set_value_deferred</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14210 <span class="keyword">void</span> <span class="identifier">set_exception_deferred</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">p</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14211 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 14212 <span class="keyword">void</span> <span class="identifier">set_exception_deferred</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14213 <span class="keyword">void</span> <span class="identifier">notify_deferred</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 14214 14215<span class="special">};</span> 14216</pre> 14217<div class="section"> 14218<div class="titlepage"><div><div><h6 class="title"> 14219<a name="thread.synchronization.futures.reference.promise.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.default_constructor" title="Default Constructor">Default 14220 Constructor</a> 14221</h6></div></div></div> 14222<pre class="programlisting"><span class="identifier">promise</span><span class="special">();</span> 14223</pre> 14224<div class="variablelist"> 14225<p class="title"><b></b></p> 14226<dl class="variablelist"> 14227<dt><span class="term">Effects:</span></dt> 14228<dd><p> 14229 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> with no associated 14230 result. 14231 </p></dd> 14232<dt><span class="term">Throws:</span></dt> 14233<dd><p> 14234 Nothing. 14235 </p></dd> 14236</dl> 14237</div> 14238</div> 14239<div class="section"> 14240<div class="titlepage"><div><div><h6 class="title"> 14241<a name="thread.synchronization.futures.reference.promise.alloc_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.alloc_constructor" title="Allocator Constructor">Allocator 14242 Constructor</a> 14243</h6></div></div></div> 14244<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span> 14245<span class="identifier">promise</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">);</span> 14246</pre> 14247<div class="variablelist"> 14248<p class="title"><b></b></p> 14249<dl class="variablelist"> 14250<dt><span class="term">Effects:</span></dt> 14251<dd><p> 14252 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> with no associated 14253 result using the allocator <code class="computeroutput"><span class="identifier">a</span></code>. 14254 </p></dd> 14255<dt><span class="term">Throws:</span></dt> 14256<dd><p> 14257 Nothing. 14258 </p></dd> 14259<dt><span class="term">Notes:</span></dt> 14260<dd><p> 14261 Available only if BOOST_THREAD_FUTURE_USES_ALLOCATORS is defined. 14262 </p></dd> 14263</dl> 14264</div> 14265</div> 14266<div class="section"> 14267<div class="titlepage"><div><div><h6 class="title"> 14268<a name="thread.synchronization.futures.reference.promise.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.move_constructor" title="Move Constructor">Move 14269 Constructor</a> 14270</h6></div></div></div> 14271<pre class="programlisting"><span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 14272</pre> 14273<div class="variablelist"> 14274<p class="title"><b></b></p> 14275<dl class="variablelist"> 14276<dt><span class="term">Effects:</span></dt> 14277<dd><p> 14278 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a>, and transfers 14279 ownership of the result associated with <code class="computeroutput"><span class="identifier">other</span></code> 14280 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 14281 leaving <code class="computeroutput"><span class="identifier">other</span></code> 14282 with no associated result. 14283 </p></dd> 14284<dt><span class="term">Throws:</span></dt> 14285<dd><p> 14286 Nothing. 14287 </p></dd> 14288<dt><span class="term">Notes:</span></dt> 14289<dd><p> 14290 If the compiler does not support rvalue-references, this is implemented 14291 using the boost.thread move emulation. 14292 </p></dd> 14293</dl> 14294</div> 14295</div> 14296<div class="section"> 14297<div class="titlepage"><div><div><h6 class="title"> 14298<a name="thread.synchronization.futures.reference.promise.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.move_assignment" title="Move Assignment Operator">Move 14299 Assignment Operator</a> 14300</h6></div></div></div> 14301<pre class="programlisting"><span class="identifier">promise</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 14302</pre> 14303<div class="variablelist"> 14304<p class="title"><b></b></p> 14305<dl class="variablelist"> 14306<dt><span class="term">Effects:</span></dt> 14307<dd><p> 14308 Transfers ownership of the result associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, leaving <code class="computeroutput"><span class="identifier">other</span></code> 14309 with no associated result. If there was already a result associated 14310 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 14311 and that result was not <span class="emphasis"><em>ready</em></span>, sets any 14312 futures associated with that result to <span class="emphasis"><em>ready</em></span> 14313 with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> 14314 exception as the result. 14315 </p></dd> 14316<dt><span class="term">Throws:</span></dt> 14317<dd><p> 14318 Nothing. 14319 </p></dd> 14320<dt><span class="term">Notes:</span></dt> 14321<dd><p> 14322 If the compiler does not support rvalue-references, this is implemented 14323 using the boost.thread move emulation. 14324 </p></dd> 14325</dl> 14326</div> 14327</div> 14328<div class="section"> 14329<div class="titlepage"><div><div><h6 class="title"> 14330<a name="thread.synchronization.futures.reference.promise.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.destructor" title="Destructor">Destructor</a> 14331</h6></div></div></div> 14332<pre class="programlisting"><span class="special">~</span><span class="identifier">promise</span><span class="special">();</span> 14333</pre> 14334<div class="variablelist"> 14335<p class="title"><b></b></p> 14336<dl class="variablelist"> 14337<dt><span class="term">Effects:</span></dt> 14338<dd><p> 14339 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 14340 If there was a result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and that result is not 14341 <span class="emphasis"><em>ready</em></span>, sets any futures associated with 14342 that task to <span class="emphasis"><em>ready</em></span> with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> exception as 14343 the result. 14344 </p></dd> 14345<dt><span class="term">Throws:</span></dt> 14346<dd><p> 14347 Nothing. 14348 </p></dd> 14349</dl> 14350</div> 14351</div> 14352<div class="section"> 14353<div class="titlepage"><div><div><h6 class="title"> 14354<a name="thread.synchronization.futures.reference.promise.get_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.get_future" title="Member Function get_future()">Member 14355 Function <code class="computeroutput"><span class="identifier">get_future</span><span class="special">()</span></code></a> 14356</h6></div></div></div> 14357<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">get_future</span><span class="special">();</span> 14358</pre> 14359<div class="variablelist"> 14360<p class="title"><b></b></p> 14361<dl class="variablelist"> 14362<dt><span class="term">Effects:</span></dt> 14363<dd><p> 14364 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14365 was not associated with a result, allocate storage for a new 14366 shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> associated with 14367 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 14368 </p></dd> 14369<dt><span class="term">Throws:</span></dt> 14370<dd><p> 14371 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_already_retrieved</span></code> if 14372 the future associated with the task has already been retrieved. 14373 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if any memory necessary 14374 could not be allocated. 14375 </p></dd> 14376</dl> 14377</div> 14378</div> 14379<div class="section"> 14380<div class="titlepage"><div><div><h6 class="title"> 14381<a name="thread.synchronization.futures.reference.promise.set_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value" title="Member Function set_value()">Member 14382 Function <code class="computeroutput"><span class="identifier">set_value</span><span class="special">()</span></code></a> 14383</h6></div></div></div> 14384<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="identifier">R</span><span class="special">&&</span> <span class="identifier">r</span><span class="special">);</span> 14385<span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span> 14386<span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">set_value</span><span class="special">(</span><span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span> 14387<span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">set_value</span><span class="special">();</span> 14388</pre> 14389<div class="variablelist"> 14390<p class="title"><b></b></p> 14391<dl class="variablelist"> 14392<dt><span class="term">Effects:</span></dt> 14393<dd> 14394<p> 14395 - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14396 was not associated with a result, allocate storage for a new 14397 shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 14398 </p> 14399<p> 14400 - Store the value <code class="computeroutput"><span class="identifier">r</span></code> 14401 in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Any threads blocked waiting 14402 for the asynchronous result are woken. 14403 </p> 14404</dd> 14405<dt><span class="term">Postconditions:</span></dt> 14406<dd><p> 14407 All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span> 14408 and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_value</span><span class="special">()</span></code></a> 14409 or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_value</span><span class="special">()</span></code></a> 14410 for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>. 14411 </p></dd> 14412<dt><span class="term">Throws:</span></dt> 14413<dd> 14414<p> 14415 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if 14416 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>. 14417 </p> 14418<p> 14419 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14420 has no shared state. 14421 </p> 14422<p> 14423 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required 14424 for storage of the result cannot be allocated. 14425 </p> 14426<p> 14427 - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>. 14428 </p> 14429</dd> 14430</dl> 14431</div> 14432</div> 14433<div class="section"> 14434<div class="titlepage"><div><div><h6 class="title"> 14435<a name="thread.synchronization.futures.reference.promise.set_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_exception" title="Member Function set_exception()">Member 14436 Function <code class="computeroutput"><span class="identifier">set_exception</span><span class="special">()</span></code></a> 14437</h6></div></div></div> 14438<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span> 14439<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 14440<span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14441</pre> 14442<div class="variablelist"> 14443<p class="title"><b></b></p> 14444<dl class="variablelist"> 14445<dt><span class="term">Effects:</span></dt> 14446<dd> 14447<p> 14448 - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14449 was not associated with a result, allocate storage for a new 14450 shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 14451 </p> 14452<p> 14453 - Store the exception <code class="computeroutput"><span class="identifier">e</span></code> 14454 in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Any threads blocked waiting 14455 for the asynchronous result are woken. 14456 </p> 14457</dd> 14458<dt><span class="term">Postconditions:</span></dt> 14459<dd><p> 14460 All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span> 14461 and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_exception" title="Member function has_exception() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a> 14462 or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_exception" title="Member function has_exception() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a> 14463 for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>. 14464 </p></dd> 14465<dt><span class="term">Throws:</span></dt> 14466<dd> 14467<p> 14468 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if 14469 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>. 14470 </p> 14471<p> 14472 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14473 has no shared state. 14474 </p> 14475<p> 14476 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required 14477 for storage of the result cannot be allocated. 14478 </p> 14479</dd> 14480</dl> 14481</div> 14482</div> 14483<div class="section"> 14484<div class="titlepage"><div><div><h6 class="title"> 14485<a name="thread.synchronization.futures.reference.promise.set_value_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value_at_thread_exit" title="Member Function set_value_at_thread_exit()">Member 14486 Function <code class="computeroutput"><span class="identifier">set_value_at_thread_exit</span><span class="special">()</span></code></a> 14487</h6></div></div></div> 14488<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">R</span><span class="special">&&</span> <span class="identifier">r</span><span class="special">);</span> 14489<span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span> 14490<span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span><span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span> 14491<span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span><span class="identifier">set_value_at_thread_exit</span><span class="special">();</span> 14492</pre> 14493<div class="variablelist"> 14494<p class="title"><b></b></p> 14495<dl class="variablelist"> 14496<dt><span class="term">Effects:</span></dt> 14497<dd><p> 14498 Stores the value r in the shared state without making that state 14499 ready immediately. Schedules that state to be made ready when 14500 the current thread exits, after all objects of thread storage 14501 duration associated with the current thread have been destroyed. 14502 </p></dd> 14503<dt><span class="term">Postconditions:</span></dt> 14504<dd><p> 14505 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is set as deferred 14506 </p></dd> 14507<dt><span class="term">Throws:</span></dt> 14508<dd> 14509<p> 14510 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if 14511 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span> 14512 or deferred. 14513 </p> 14514<p> 14515 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14516 has no shared state. 14517 </p> 14518<p> 14519 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required 14520 for storage of the result cannot be allocated. 14521 </p> 14522<p> 14523 - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>. 14524 </p> 14525</dd> 14526</dl> 14527</div> 14528</div> 14529<div class="section"> 14530<div class="titlepage"><div><div><h6 class="title"> 14531<a name="thread.synchronization.futures.reference.promise.set_exception_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_exception_at_thread_exit" title="Member Function set_exception_at_thread_exit()">Member 14532 Function <code class="computeroutput"><span class="identifier">set_exception_at_thread_exit</span><span class="special">()</span></code></a> 14533</h6></div></div></div> 14534<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span> 14535<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 14536<span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">p</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14537</pre> 14538<div class="variablelist"> 14539<p class="title"><b></b></p> 14540<dl class="variablelist"> 14541<dt><span class="term">Effects:</span></dt> 14542<dd><p> 14543 Stores the exception pointer p in the shared state without making 14544 that state ready immediately. Schedules that state to be made 14545 ready when the current thread exits, after all objects of thread 14546 storage duration associated with the current thread have been 14547 destroyed. 14548 </p></dd> 14549<dt><span class="term">Postconditions:</span></dt> 14550<dd><p> 14551 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is set as deferred 14552 </p></dd> 14553<dt><span class="term">Throws:</span></dt> 14554<dd> 14555<p> 14556 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if 14557 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span> 14558 or deferred. 14559 </p> 14560<p> 14561 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14562 has no shared state. 14563 </p> 14564<p> 14565 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required 14566 for storage of the result cannot be allocated. 14567 </p> 14568</dd> 14569</dl> 14570</div> 14571</div> 14572<div class="section"> 14573<div class="titlepage"><div><div><h6 class="title"> 14574<a name="thread.synchronization.futures.reference.promise.set_wait_callback"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_wait_callback" title="Member Function set_wait_callback() EXTENSION">Member 14575 Function <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> EXTENSION</a> 14576</h6></div></div></div> 14577<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> 14578<span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> 14579</pre> 14580<div class="variablelist"> 14581<p class="title"><b></b></p> 14582<dl class="variablelist"> 14583<dt><span class="term">Preconditions:</span></dt> 14584<dd><p> 14585 The expression <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> where <code class="computeroutput"><span class="identifier">t</span></code> 14586 is a lvalue of type <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> shall be well-formed. 14587 Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code> 14588 shall have the same effect as invoking <code class="computeroutput"><span class="identifier">f</span></code> 14589 </p></dd> 14590<dt><span class="term">Effects:</span></dt> 14591<dd><p> 14592 Store a copy of <code class="computeroutput"><span class="identifier">f</span></code> 14593 with the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as a <span class="emphasis"><em>wait callback</em></span>. 14594 This will replace any existing wait callback store alongside 14595 that result. If a thread subsequently calls one of the wait functions 14596 on a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> associated 14597 with this result, and the result is not <span class="emphasis"><em>ready</em></span>, 14598 <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code> 14599 shall be invoked. 14600 </p></dd> 14601<dt><span class="term">Throws:</span></dt> 14602<dd><p> 14603 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory cannot 14604 be allocated for the required storage. 14605 </p></dd> 14606</dl> 14607</div> 14608</div> 14609<div class="section"> 14610<div class="titlepage"><div><div><h6 class="title"> 14611<a name="thread.synchronization.futures.reference.promise.set_value0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value0" title="Member Function set_value_deferred() EXTENSION">Member 14612 Function <code class="computeroutput"><span class="identifier">set_value_deferred</span><span class="special">()</span></code> EXTENSION</a> 14613</h6></div></div></div> 14614<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_value_deferred</span><span class="special">(</span><span class="identifier">R</span><span class="special">&&</span> <span class="identifier">r</span><span class="special">);</span> 14615<span class="keyword">void</span> <span class="identifier">set_value_deferred</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span> 14616<span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="identifier">R</span><span class="special">&>::</span> <span class="identifier">set_value_deferred</span><span class="special">(</span><span class="identifier">R</span><span class="special">&</span> <span class="identifier">r</span><span class="special">);</span> 14617<span class="keyword">void</span> <span class="identifier">promise</span><span class="special"><</span><span class="keyword">void</span><span class="special">>::</span> <span class="identifier">set_value_deferred</span><span class="special">();</span> 14618</pre> 14619<div class="variablelist"> 14620<p class="title"><b></b></p> 14621<dl class="variablelist"> 14622<dt><span class="term">Effects:</span></dt> 14623<dd> 14624<p> 14625 - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14626 was not associated with a result, allocate storage for a new 14627 shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 14628 </p> 14629<p> 14630 - Stores the value <code class="computeroutput"><span class="identifier">r</span></code> 14631 in the shared state without making that state ready immediately. 14632 Threads blocked waiting for the asynchronous result are not woken. 14633 They will be woken only when <code class="computeroutput"><span class="identifier">notify_deferred</span></code> 14634 is called. 14635 </p> 14636</dd> 14637<dt><span class="term">Postconditions:</span></dt> 14638<dd><p> 14639 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is set as deferred 14640 </p></dd> 14641<dt><span class="term">Throws:</span></dt> 14642<dd> 14643<p> 14644 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if 14645 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span> 14646 or deferred. 14647 </p> 14648<p> 14649 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14650 has no shared state. 14651 </p> 14652<p> 14653 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required 14654 for storage of the result cannot be allocated. 14655 </p> 14656<p> 14657 - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>. 14658 </p> 14659</dd> 14660</dl> 14661</div> 14662</div> 14663<div class="section"> 14664<div class="titlepage"><div><div><h6 class="title"> 14665<a name="thread.synchronization.futures.reference.promise.set_exception0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_exception0" title="Member Function set_exception_deferred() EXTENSION">Member 14666 Function <code class="computeroutput"><span class="identifier">set_exception_deferred</span><span class="special">()</span></code> EXTENSION</a> 14667</h6></div></div></div> 14668<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_exception_deferred</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span> 14669<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 14670<span class="keyword">void</span> <span class="identifier">set_exception_deferred</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14671</pre> 14672<div class="variablelist"> 14673<p class="title"><b></b></p> 14674<dl class="variablelist"> 14675<dt><span class="term">Effects:</span></dt> 14676<dd> 14677<p> 14678 - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14679 was not associated with a result, allocate storage for a new 14680 shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 14681 </p> 14682<p> 14683 - Store the exception <code class="computeroutput"><span class="identifier">e</span></code> 14684 in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>without making that state 14685 ready immediately. Threads blocked waiting for the asynchronous 14686 result are not woken. They will be woken only when <code class="computeroutput"><span class="identifier">notify_deferred</span></code> is called. 14687 </p> 14688</dd> 14689<dt><span class="term">Postconditions:</span></dt> 14690<dd><p> 14691 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is set as deferred 14692 </p></dd> 14693<dt><span class="term">Throws:</span></dt> 14694<dd> 14695<p> 14696 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if 14697 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span> 14698 or deferred. 14699 </p> 14700<p> 14701 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 14702 has no shared state. 14703 </p> 14704<p> 14705 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required 14706 for storage of the result cannot be allocated. 14707 </p> 14708</dd> 14709</dl> 14710</div> 14711</div> 14712<div class="section"> 14713<div class="titlepage"><div><div><h6 class="title"> 14714<a name="thread.synchronization.futures.reference.promise.set_value1"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value1" title="Member Function notify_deferred() EXTENSION">Member 14715 Function <code class="computeroutput"><span class="identifier">notify_deferred</span><span class="special">()</span></code> EXTENSION</a> 14716</h6></div></div></div> 14717<div class="variablelist"> 14718<p class="title"><b></b></p> 14719<dl class="variablelist"> 14720<dt><span class="term">Effects:</span></dt> 14721<dd><p> 14722 Any threads blocked waiting for the asynchronous result are woken. 14723 </p></dd> 14724<dt><span class="term">Postconditions:</span></dt> 14725<dd><p> 14726 All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span> 14727 and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_value</span><span class="special">()</span></code></a> 14728 or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>::</span><span class="identifier">has_value</span><span class="special">()</span></code></a> 14729 for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>. 14730 </p></dd> 14731<dt><span class="term">Postconditions:</span></dt> 14732<dd><p> 14733 the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready. 14734 </p></dd> 14735</dl> 14736</div> 14737</div> 14738</div> 14739<div class="section"> 14740<div class="titlepage"><div><div><h5 class="title"> 14741<a name="thread.synchronization.futures.reference.packaged_task"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">packaged_task</span></code> class template</a> 14742</h5></div></div></div> 14743<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">></span> 14744<span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">;</span> 14745<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span> 14746 <span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">ArgTypes</span> 14747<span class="special">></span> 14748<span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special"><</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">)></span> 14749<span class="special">{</span> 14750<span class="keyword">public</span><span class="special">:</span> 14751 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 14752 <span class="identifier">packaged_task</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span> 14753 14754 <span class="comment">// construction and destruction</span> 14755 <span class="identifier">packaged_task</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span> 14756 14757 <span class="keyword">explicit</span> <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span> 14758 14759 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> 14760 <span class="keyword">explicit</span> <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span> 14761 14762 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span> 14763 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span> 14764 <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">Allocator</span><span class="special">></span> 14765 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span> 14766 14767 <span class="special">~</span><span class="identifier">packaged_task</span><span class="special">()</span> 14768 <span class="special">{}</span> 14769 14770 <span class="comment">// move support</span> 14771 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 14772 <span class="identifier">packaged_task</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span><span class="special">&&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 14773 14774 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> 14775 14776 <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> 14777 <span class="comment">// result retrieval</span> 14778 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">get_future</span><span class="special">();</span> 14779 14780 <span class="comment">// execution</span> 14781 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgTypes</span><span class="special">...</span> <span class="special">);</span> 14782 <span class="keyword">void</span> <span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">...);</span> 14783 14784 <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span> 14785 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 14786 <span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 14787<span class="special">};</span> 14788</pre> 14789<div class="section"> 14790<div class="titlepage"><div><div><h6 class="title"> 14791<a name="thread.synchronization.futures.reference.packaged_task.task_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.task_constructor" title="Task Constructor">Task 14792 Constructor</a> 14793</h6></div></div></div> 14794<pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span> 14795 14796<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> 14797<span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span><span class="identifier">f</span><span class="special">);</span> 14798</pre> 14799<div class="variablelist"> 14800<p class="title"><b></b></p> 14801<dl class="variablelist"> 14802<dt><span class="term">Preconditions:</span></dt> 14803<dd><p> 14804 <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code> 14805 is a valid expression with a return type convertible to <code class="computeroutput"><span class="identifier">R</span></code>. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code> must behave the same as invoking 14806 <code class="computeroutput"><span class="identifier">f</span></code>. 14807 </p></dd> 14808<dt><span class="term">Effects:</span></dt> 14809<dd><p> 14810 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> with 14811 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)</span></code> 14812 stored as the associated task. 14813 </p></dd> 14814<dt><span class="term">Throws:</span></dt> 14815<dd> 14816<p> 14817 - Any exceptions thrown by the copy (or move) constructor of 14818 <code class="computeroutput"><span class="identifier">f</span></code>. 14819 </p> 14820<p> 14821 - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory for the 14822 internal data structures could not be allocated. 14823 </p> 14824</dd> 14825<dt><span class="term">Notes:</span></dt> 14826<dd><p> 14827 The R(*f)(ArgTypes...)) overload to allow passing a function 14828 without needing to use <code class="computeroutput"><span class="special">&</span></code>. 14829 </p></dd> 14830<dt><span class="term">Remark:</span></dt> 14831<dd><p> 14832 This constructor doesn't participate in overload resolution if 14833 decay<F>::type is the same type as boost::packaged_task<R>. 14834 </p></dd> 14835</dl> 14836</div> 14837</div> 14838<div class="section"> 14839<div class="titlepage"><div><div><h6 class="title"> 14840<a name="thread.synchronization.futures.reference.packaged_task.alloc_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.alloc_constructor" title="Allocator Constructor">Allocator 14841 Constructor</a> 14842</h6></div></div></div> 14843<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span> 14844<span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span> 14845<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">Allocator</span><span class="special">></span> 14846<span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span> 14847</pre> 14848<div class="variablelist"> 14849<p class="title"><b></b></p> 14850<dl class="variablelist"> 14851<dt><span class="term">Preconditions:</span></dt> 14852<dd><p> 14853 <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code> 14854 is a valid expression with a return type convertible to <code class="computeroutput"><span class="identifier">R</span></code>. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code> shall behave the same as 14855 invoking <code class="computeroutput"><span class="identifier">f</span></code>. 14856 </p></dd> 14857<dt><span class="term">Effects:</span></dt> 14858<dd><p> 14859 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> with 14860 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)</span></code> 14861 stored as the associated task using the allocator <code class="computeroutput"><span class="identifier">a</span></code>. 14862 </p></dd> 14863<dt><span class="term">Throws:</span></dt> 14864<dd><p> 14865 Any exceptions thrown by the copy (or move) constructor of <code class="computeroutput"><span class="identifier">f</span></code>. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> 14866 if memory for the internal data structures could not be allocated. 14867 </p></dd> 14868<dt><span class="term">Notes:</span></dt> 14869<dd><p> 14870 Available only if BOOST_THREAD_FUTURE_USES_ALLOCATORS is defined. 14871 </p></dd> 14872<dt><span class="term">Notes:</span></dt> 14873<dd><p> 14874 The R(*f)(ArgTypes...)) overload to allow passing a function 14875 without needing to use <code class="computeroutput"><span class="special">&</span></code>. 14876 </p></dd> 14877</dl> 14878</div> 14879</div> 14880<div class="section"> 14881<div class="titlepage"><div><div><h6 class="title"> 14882<a name="thread.synchronization.futures.reference.packaged_task.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.move_constructor" title="Move Constructor">Move 14883 Constructor</a> 14884</h6></div></div></div> 14885<pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 14886</pre> 14887<div class="variablelist"> 14888<p class="title"><b></b></p> 14889<dl class="variablelist"> 14890<dt><span class="term">Effects:</span></dt> 14891<dd><p> 14892 Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>, and transfers 14893 ownership of the task associated with <code class="computeroutput"><span class="identifier">other</span></code> 14894 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 14895 leaving <code class="computeroutput"><span class="identifier">other</span></code> 14896 with no associated task. 14897 </p></dd> 14898<dt><span class="term">Throws:</span></dt> 14899<dd><p> 14900 Nothing. 14901 </p></dd> 14902<dt><span class="term">Notes:</span></dt> 14903<dd><p> 14904 If the compiler does not support rvalue-references, this is implemented 14905 using the boost.thread move emulation. 14906 </p></dd> 14907</dl> 14908</div> 14909</div> 14910<div class="section"> 14911<div class="titlepage"><div><div><h6 class="title"> 14912<a name="thread.synchronization.futures.reference.packaged_task.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.move_assignment" title="Move Assignment Operator">Move 14913 Assignment Operator</a> 14914</h6></div></div></div> 14915<pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span> <span class="special">&&</span> <span class="identifier">other</span><span class="special">);</span> 14916</pre> 14917<div class="variablelist"> 14918<p class="title"><b></b></p> 14919<dl class="variablelist"> 14920<dt><span class="term">Effects:</span></dt> 14921<dd><p> 14922 Transfers ownership of the task associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, leaving <code class="computeroutput"><span class="identifier">other</span></code> 14923 with no associated task. If there was already a task associated 14924 with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 14925 and that task has not been invoked, sets any futures associated 14926 with that task to <span class="emphasis"><em>ready</em></span> with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> exception as 14927 the result. 14928 </p></dd> 14929<dt><span class="term">Throws:</span></dt> 14930<dd><p> 14931 Nothing. 14932 </p></dd> 14933<dt><span class="term">Notes:</span></dt> 14934<dd><p> 14935 If the compiler does not support rvalue-references, this is implemented 14936 using the boost.thread move emulation. 14937 </p></dd> 14938</dl> 14939</div> 14940</div> 14941<div class="section"> 14942<div class="titlepage"><div><div><h6 class="title"> 14943<a name="thread.synchronization.futures.reference.packaged_task.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.destructor" title="Destructor">Destructor</a> 14944</h6></div></div></div> 14945<pre class="programlisting"><span class="special">~</span><span class="identifier">packaged_task</span><span class="special">();</span> 14946</pre> 14947<div class="variablelist"> 14948<p class="title"><b></b></p> 14949<dl class="variablelist"> 14950<dt><span class="term">Effects:</span></dt> 14951<dd><p> 14952 Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 14953 If there was a task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and that task has not been 14954 invoked, sets any futures associated with that task to <span class="emphasis"><em>ready</em></span> 14955 with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> 14956 exception as the result. 14957 </p></dd> 14958<dt><span class="term">Throws:</span></dt> 14959<dd><p> 14960 Nothing. 14961 </p></dd> 14962</dl> 14963</div> 14964</div> 14965<div class="section"> 14966<div class="titlepage"><div><div><h6 class="title"> 14967<a name="thread.synchronization.futures.reference.packaged_task.get_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.get_future" title="Member Function get_future()">Member 14968 Function <code class="computeroutput"><span class="identifier">get_future</span><span class="special">()</span></code></a> 14969</h6></div></div></div> 14970<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="identifier">R</span><span class="special">></span> <span class="identifier">get_future</span><span class="special">();</span> 14971</pre> 14972<div class="variablelist"> 14973<p class="title"><b></b></p> 14974<dl class="variablelist"> 14975<dt><span class="term">Effects:</span></dt> 14976<dd><p> 14977 Returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> associated with 14978 the result of the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 14979 </p></dd> 14980<dt><span class="term">Throws:</span></dt> 14981<dd><p> 14982 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of 14983 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another 14984 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_already_retrieved</span></code> if 14985 the future associated with the task has already been retrieved. 14986 </p></dd> 14987</dl> 14988</div> 14989</div> 14990<div class="section"> 14991<div class="titlepage"><div><div><h6 class="title"> 14992<a name="thread.synchronization.futures.reference.packaged_task.call_operator"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.call_operator" title="Member Function operator()()">Member 14993 Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code></a> 14994</h6></div></div></div> 14995<pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()();</span> 14996</pre> 14997<div class="variablelist"> 14998<p class="title"><b></b></p> 14999<dl class="variablelist"> 15000<dt><span class="term">Effects:</span></dt> 15001<dd><p> 15002 Invoke the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and store the result in the 15003 corresponding future. If the task returns normally, the return 15004 value is stored as the shared state, otherwise the exception 15005 thrown is stored. Any threads blocked waiting for the shared 15006 state associated with this task are woken. 15007 </p></dd> 15008<dt><span class="term">Postconditions:</span></dt> 15009<dd><p> 15010 All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span> 15011 </p></dd> 15012<dt><span class="term">Throws:</span></dt> 15013<dd> 15014<p> 15015 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of 15016 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another 15017 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. 15018 </p> 15019<p> 15020 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span></code> if the 15021 task has already been invoked. 15022 </p> 15023</dd> 15024</dl> 15025</div> 15026</div> 15027<div class="section"> 15028<div class="titlepage"><div><div><h6 class="title"> 15029<a name="thread.synchronization.futures.reference.packaged_task.make_ready_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.make_ready_at_thread_exit" title="Member Function make_ready_at_thread_exit()">Member 15030 Function <code class="computeroutput"><span class="identifier">make_ready_at_thread_exit</span><span class="special">()</span></code></a> 15031</h6></div></div></div> 15032<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">...);</span> 15033</pre> 15034<div class="variablelist"> 15035<p class="title"><b></b></p> 15036<dl class="variablelist"> 15037<dt><span class="term">Effects:</span></dt> 15038<dd><p> 15039 Invoke the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and store the result in the 15040 corresponding future. If the task returns normally, the return 15041 value is stored as the shared state, otherwise the exception 15042 thrown is stored. In either case, this is done without making 15043 that state ready immediately. Schedules the shared state to be 15044 made ready when the current thread exits, after all objects of 15045 thread storage duration associated with the current thread have 15046 been destroyed. 15047 </p></dd> 15048<dt><span class="term">Throws:</span></dt> 15049<dd> 15050<p> 15051 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of 15052 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another 15053 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. 15054 </p> 15055<p> 15056 - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span></code> if the 15057 task has already been invoked. 15058 </p> 15059</dd> 15060</dl> 15061</div> 15062</div> 15063<div class="section"> 15064<div class="titlepage"><div><div><h6 class="title"> 15065<a name="thread.synchronization.futures.reference.packaged_task.reset"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.reset" title="Member Function reset()">Member 15066 Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a> 15067</h6></div></div></div> 15068<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span> 15069</pre> 15070<div class="variablelist"> 15071<p class="title"><b></b></p> 15072<dl class="variablelist"> 15073<dt><span class="term">Effects:</span></dt> 15074<dd><p> 15075 Reset the state of the packaged_task so that it can be called 15076 again. 15077 </p></dd> 15078<dt><span class="term">Throws:</span></dt> 15079<dd><p> 15080 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of 15081 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another 15082 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. 15083 </p></dd> 15084</dl> 15085</div> 15086</div> 15087<div class="section"> 15088<div class="titlepage"><div><div><h6 class="title"> 15089<a name="thread.synchronization.futures.reference.packaged_task.set_wait_callback"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.set_wait_callback" title="Member Function set_wait_callback() EXTENSION">Member 15090 Function <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> EXTENSION</a> 15091</h6></div></div></div> 15092<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> 15093<span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> 15094</pre> 15095<div class="variablelist"> 15096<p class="title"><b></b></p> 15097<dl class="variablelist"> 15098<dt><span class="term">Preconditions:</span></dt> 15099<dd><p> 15100 The expression <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> where <code class="computeroutput"><span class="identifier">t</span></code> 15101 is a lvalue of type <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> shall 15102 be well-formed. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code> 15103 shall have the same effect as invoking <code class="computeroutput"><span class="identifier">f</span></code> 15104 </p></dd> 15105<dt><span class="term">Effects:</span></dt> 15106<dd><p> 15107 Store a copy of <code class="computeroutput"><span class="identifier">f</span></code> 15108 with the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as a <span class="emphasis"><em>wait callback</em></span>. 15109 This will replace any existing wait callback store alongside 15110 that task. If a thread subsequently calls one of the wait functions 15111 on a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> associated 15112 with this task, and the result of the task is not <span class="emphasis"><em>ready</em></span>, 15113 <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code> 15114 shall be invoked. 15115 </p></dd> 15116<dt><span class="term">Throws:</span></dt> 15117<dd><p> 15118 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of 15119 the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another 15120 instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. 15121 </p></dd> 15122</dl> 15123</div> 15124</div> 15125</div> 15126<div class="section"> 15127<div class="titlepage"><div><div><h5 class="title"> 15128<a name="thread.synchronization.futures.reference.decay_copy"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.decay_copy" title="Non-member function decay_copy()">Non-member 15129 function <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code></a> 15130</h5></div></div></div> 15131<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> 15132<span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">v</span><span class="special">)</span> 15133<span class="special">{</span> 15134 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">v</span><span class="special">);</span> 15135<span class="special">}</span> 15136</pre> 15137</div> 15138<div class="section"> 15139<div class="titlepage"><div><div><h5 class="title"> 15140<a name="thread.synchronization.futures.reference.async"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async" title="Non-member function async()">Non-member 15141 function <code class="computeroutput"><span class="identifier">async</span><span class="special">()</span></code></a> 15142</h5></div></div></div> 15143<p> 15144 The function template async provides a mechanism to launch a function 15145 potentially in a new thread and provides the result of the function in 15146 a future object with which it shares a shared state. 15147 </p> 15148<h6> 15149<a name="thread.synchronization.futures.reference.async.h0"></a> 15150 <span class="phrase"><a name="thread.synchronization.futures.reference.async.non_variadic_variant"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async.non_variadic_variant">Non-Variadic 15151 variant</a> 15152 </h6> 15153<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> 15154 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span> 15155 <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span> 15156<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> 15157 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span> 15158 <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&&</span> <span class="identifier">f</span><span class="special">);</span> 15159<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">F</span><span class="special">></span> 15160 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span> 15161 <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&</span><span class="identifier">ex</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="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 15162</pre> 15163<div class="variablelist"> 15164<p class="title"><b></b></p> 15165<dl class="variablelist"> 15166<dt><span class="term">Requires:</span></dt> 15167<dd> 15168<p> 15169</p> 15170<pre class="programlisting"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))()</span> 15171</pre> 15172<p> 15173 </p> 15174<p> 15175 shall be a valid expression. 15176 </p> 15177</dd> 15178<dt><span class="term">Effects</span></dt> 15179<dd> 15180<p> 15181 The first function behaves the same as a call to the second function 15182 with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span> 15183 <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> 15184 and the same arguments for <code class="computeroutput"><span class="identifier">F</span></code>. 15185 </p> 15186<p> 15187 The second and third functions create a shared state that is associated 15188 with the returned future object. 15189 </p> 15190<p> 15191 The further behavior of the second function depends on the policy 15192 argument as follows (if more than one of these conditions applies, 15193 the implementation may choose any of the corresponding policies): 15194 </p> 15195<p> 15196 - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&</span> 15197 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> is non-zero - calls <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))()</span></code> 15198 as if in a new thread of execution represented by a thread object 15199 with the calls to <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code> being evaluated in the thread 15200 that called <code class="computeroutput"><span class="identifier">async</span></code>. 15201 Any return value is stored as the result in the shared state. Any 15202 exception propagated from the execution of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))()</span></code> is stored as the exceptional 15203 result in the shared state. The thread object is stored in the 15204 shared state and affects the behavior of any asynchronous return 15205 objects that reference that state. 15206 </p> 15207<p> 15208 - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&</span> 15209 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> is non-zero - Stores 15210 <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))</span></code> 15211 in the shared state. This copy of <code class="computeroutput"><span class="identifier">f</span></code> 15212 constitute a deferred function. Invocation of the deferred function 15213 evaluates <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">)()</span></code> where <code class="computeroutput"><span class="identifier">g</span></code> 15214 is the stored value of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))</span></code>. The shared state is not made 15215 ready until the function has completed. The first call to a non-timed 15216 waiting function on an asynchronous return object referring to 15217 this shared state shall invoke the deferred function in the thread 15218 that called the waiting function. Once evaluation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">)()</span></code> 15219 begins, the function is no longer considered deferred. (Note: If 15220 this policy is specified together with other policies, such as 15221 when using a policy value of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span> 15222 <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>, 15223 implementations should defer invocation or the selection of the 15224 policy when no more concurrency can be effectively exploited.) 15225 </p> 15226<p> 15227 - if no valid launch policy is provided the behavior is undefined. 15228 </p> 15229<p> 15230 The further behavior of the third function is as follows: 15231 </p> 15232<p> 15233 - The Executor::submit() function is given a function<void ()> 15234 which calls `INVOKE (DECAY_COPY (std::forward<F>(f)), DECAY_COPY 15235 (std::forward<Args>(args))...). The implementation of the 15236 executor is decided by the programmer. 15237 </p> 15238</dd> 15239<dt><span class="term">Returns:</span></dt> 15240<dd><p> 15241 An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> 15242 <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">()>::</span><span class="identifier">type</span><span class="special">></span></code> 15243 that refers to the shared state created by this call to <code class="computeroutput"><span class="identifier">async</span></code>. 15244 </p></dd> 15245<dt><span class="term">Synchronization:</span></dt> 15246<dd> 15247<p> 15248 Regardless of the provided policy argument, 15249 </p> 15250<p> 15251 - the invocation of <code class="computeroutput"><span class="identifier">async</span></code> 15252 synchronizes with the invocation of <code class="computeroutput"><span class="identifier">f</span></code>. 15253 (Note: This statement applies even when the corresponding future 15254 object is moved to another thread.); and 15255 </p> 15256<p> 15257 - the completion of the function <code class="computeroutput"><span class="identifier">f</span></code> 15258 is sequenced before the shared state is made ready. (Note: <code class="computeroutput"><span class="identifier">f</span></code> might not be called at all, 15259 so its completion might never happen.) 15260 </p> 15261<p> 15262 If the implementation chooses the <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> 15263 policy, 15264 </p> 15265<p> 15266 - a call to a non-timed waiting function on an asynchronous return 15267 object that shares the shared state created by this async call 15268 shall block until the associated thread has completed, as if joined, 15269 or else time out; 15270 </p> 15271<p> 15272 - the associated thread completion synchronizes with the return 15273 from the first function that successfully detects the ready status 15274 of the shared state or with the return from the last function that 15275 releases the shared state, whichever happens first. 15276 </p> 15277</dd> 15278<dt><span class="term">Throws:</span></dt> 15279<dd><p> 15280 <code class="computeroutput"><span class="identifier">system_error</span></code> if 15281 policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> 15282 and the implementation is unable to start a new thread. 15283 </p></dd> 15284<dt><span class="term">Error conditions:</span></dt> 15285<dd><p> 15286 - <code class="computeroutput"><span class="identifier">resource_unavailable_try_again</span></code> 15287 - if policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> 15288 and the system is unable to start a new thread. 15289 </p></dd> 15290<dt><span class="term">Remarks::</span></dt> 15291<dd><p> 15292 The first signature shall not participate in overload resolution 15293 if <code class="computeroutput"><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">F</span><span class="special">></span> 15294 <span class="identifier">is</span> </code>boost:: launch<code class="computeroutput"> 15295 <span class="keyword">or</span> </code>boost::is_executor<F><code class="computeroutput"> 15296 <span class="identifier">is</span> </code>true_type`. 15297 </p></dd> 15298</dl> 15299</div> 15300<h6> 15301<a name="thread.synchronization.futures.reference.async.h1"></a> 15302 <span class="phrase"><a name="thread.synchronization.futures.reference.async.variadic_variant"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async.variadic_variant">Variadic 15303 variant</a> 15304 </h6> 15305<pre class="programlisting"><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="special">...</span> <span class="identifier">Args</span><span class="special">></span> 15306 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span> 15307 <span class="identifier">async</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="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 15308<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="special">...</span> <span class="identifier">Args</span><span class="special">></span> 15309 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span> 15310 <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</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="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 15311<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</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="special">...</span> <span class="identifier">Args</span><span class="special">></span> 15312 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span> 15313 <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&</span><span class="identifier">ex</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="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">);</span> 15314</pre> 15315<div class="warning"><table border="0" summary="Warning"> 15316<tr> 15317<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 15318<th align="left">Warning</th> 15319</tr> 15320<tr><td align="left" valign="top"><p> 15321 the variadic prototype is provided only on C++11 compilers supporting 15322 rvalue references, variadic templates, decltype and a standard library 15323 providing <tuple> (waiting for a boost::tuple that is move aware), 15324 and BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK is defined. 15325 </p></td></tr> 15326</table></div> 15327<div class="variablelist"> 15328<p class="title"><b></b></p> 15329<dl class="variablelist"> 15330<dt><span class="term">Requires:</span></dt> 15331<dd> 15332<p> 15333 <code class="computeroutput"><span class="identifier">F</span></code> and each <code class="computeroutput"><span class="identifier">Ti</span></code> in <code class="computeroutput"><span class="identifier">Args</span></code> 15334 shall satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code> 15335 requirements. 15336 </p> 15337<p> 15338 invoke (decay_copy (boost::forward<F>(f)), decay_copy (boost::forward<Args>(args))...) 15339 </p> 15340<p> 15341 shall be a valid expression. 15342 </p> 15343</dd> 15344<dt><span class="term">Effects:</span></dt> 15345<dd> 15346<p> 15347 - The first function behaves the same as a call to the second function 15348 with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span> 15349 <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> 15350 and the same arguments for <code class="computeroutput"><span class="identifier">F</span></code> 15351 and <code class="computeroutput"><span class="identifier">Args</span></code>. 15352 </p> 15353<p> 15354 - The second function creates a shared state that is associated 15355 with the returned future object. The further behavior of the second 15356 function depends on the policy argument as follows (if more than 15357 one of these conditions applies, the implementation may choose 15358 any of the corresponding policies): 15359 </p> 15360<p> 15361 - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&</span> 15362 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> is non-zero - calls <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">)),</span> 15363 <span class="identifier">decay_copy</span> <span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code> 15364 as if in a new thread of execution represented by a thread object 15365 with the calls to <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code> being evaluated in the thread 15366 that called <code class="computeroutput"><span class="identifier">async</span></code>. 15367 Any return value is stored as the result in the shared state. Any 15368 exception propagated from the execution of <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</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="identifier">decay_copy</span> 15369 <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...)</span></code> is stored as the exceptional 15370 result in the shared state. The thread object is stored in the 15371 shared state and affects the behavior of any asynchronous return 15372 objects that reference that state. 15373 </p> 15374<p> 15375 - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&</span> 15376 <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> is non-zero - Stores 15377 <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))</span></code> 15378 and <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...</span></code> in the shared state. These 15379 copies of <code class="computeroutput"><span class="identifier">f</span></code> and 15380 <code class="computeroutput"><span class="identifier">args</span></code> constitute 15381 a deferred function. Invocation of the deferred function evaluates 15382 <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">),</span> 15383 <span class="identifier">move</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">))</span></code> 15384 where <code class="computeroutput"><span class="identifier">g</span></code> is the 15385 stored value of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">F</span><span class="special">>(</span><span class="identifier">f</span><span class="special">))</span></code> and <code class="computeroutput"><span class="identifier">xyz</span></code> 15386 is the stored copy of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">))...</span></code>. The shared state is not made 15387 ready until the function has completed. The first call to a non-timed 15388 waiting function on an asynchronous return object referring to 15389 this shared state shall invoke the deferred function in the thread 15390 that called the waiting function. Once evaluation of <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">),</span> 15391 <span class="identifier">move</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">))</span></code> 15392 begins, the function is no longer considered deferred. 15393 </p> 15394<p> 15395 - if no valid launch policy is provided the behaviour is undefined. 15396 </p> 15397</dd> 15398<dt><span class="term">Note:</span></dt> 15399<dd><p> 15400 If this policy is specified together with other policies, such 15401 as when using a policy value of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span> 15402 <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>, 15403 implementations should defer invocation or the selection of the 15404 policy when no more concurrency can be effectively exploited. 15405 </p></dd> 15406<dt><span class="term">Returns:</span></dt> 15407<dd><p> 15408 An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special"><</span><span class="keyword">typename</span> 15409 <span class="identifier">decay</span><span class="special"><</span><span class="identifier">F</span><span class="special">>::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>::</span><span class="identifier">type</span><span class="special">...)>::</span><span class="identifier">type</span><span class="special">></span></code> that refers to the shared state 15410 created by this call to <code class="computeroutput"><span class="identifier">async</span></code>. 15411 </p></dd> 15412<dt><span class="term">Synchronization:</span></dt> 15413<dd> 15414<p> 15415 Regardless of the provided policy argument, 15416 </p> 15417<p> 15418 - the invocation of async synchronizes with the invocation of 15419 <code class="computeroutput"><span class="identifier">f</span></code>. (Note: This 15420 statement applies even when the corresponding future object is 15421 moved to another thread.); and 15422 </p> 15423<p> 15424 - the completion of the function <code class="computeroutput"><span class="identifier">f</span></code> 15425 is sequenced before the shared state is made ready. (Note: f might 15426 not be called at all, so its completion might never happen.) 15427 </p> 15428<p> 15429 If the implementation chooses the <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> 15430 policy, 15431 </p> 15432<p> 15433 - a call to a waiting function on an asynchronous return object 15434 that shares the shared state created by this async call shall block 15435 until the associated thread has completed, as if joined, or else 15436 time out; 15437 </p> 15438<p> 15439 - the associated thread completion synchronizes with the return 15440 from the first function that successfully detects the ready status 15441 of the shared state or with the return from the last function that 15442 releases the shared state, whichever happens first. 15443 </p> 15444</dd> 15445<dt><span class="term">Throws:</span></dt> 15446<dd><p> 15447 <code class="computeroutput"><span class="identifier">system_error</span></code> if 15448 policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> 15449 and the implementation is unable to start a new thread. 15450 </p></dd> 15451<dt><span class="term">Error conditions:</span></dt> 15452<dd><p> 15453 - <code class="computeroutput"><span class="identifier">resource_unavailable_try_again</span></code> 15454 - if policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> 15455 and the system is unable to start a new thread. 15456 </p></dd> 15457<dt><span class="term">Remarks:</span></dt> 15458<dd><p> 15459 The first signature shall not participate in overload resolution 15460 if decay<F>::type is boost::launch. 15461 </p></dd> 15462</dl> 15463</div> 15464</div> 15465<div class="section"> 15466<div class="titlepage"><div><div><h5 class="title"> 15467<a name="thread.synchronization.futures.reference.wait_for_any"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_any" title="Non-member function wait_for_any() - EXTENSION">Non-member 15468 function <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code> 15469 - EXTENSION</a> 15470</h5></div></div></div> 15471<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span> 15472 <span class="identifier">Iterator</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15473 15474<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">></span> 15475 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15476 15477<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">></span> 15478 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15479 15480<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F4</span><span class="special">></span> 15481 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&</span> <span class="identifier">f4</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15482 15483<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F4</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F5</span><span class="special">></span> 15484 <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&</span> <span class="identifier">f4</span><span class="special">,</span><span class="identifier">F5</span><span class="special">&</span> <span class="identifier">f5</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15485</pre> 15486<div class="variablelist"> 15487<p class="title"><b></b></p> 15488<dl class="variablelist"> 15489<dt><span class="term">Preconditions:</span></dt> 15490<dd><p> 15491 The types <code class="computeroutput"><span class="identifier">Fn</span></code> shall 15492 be specializations of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, and <code class="computeroutput"><span class="identifier">Iterator</span></code> shall be a forward iterator 15493 with a <code class="computeroutput"><span class="identifier">value_type</span></code> 15494 which is a specialization of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>. 15495 </p></dd> 15496<dt><span class="term">Effects:</span></dt> 15497<dd><p> 15498 Waits until at least one of the specified futures is <span class="emphasis"><em>ready</em></span>. 15499 </p></dd> 15500<dt><span class="term">Returns:</span></dt> 15501<dd><p> 15502 The range-based overload returns an <code class="computeroutput"><span class="identifier">Iterator</span></code> 15503 identifying the first future in the range that was detected as 15504 <span class="emphasis"><em>ready</em></span>. The remaining overloads return the 15505 zero-based index of the first future that was detected as <span class="emphasis"><em>ready</em></span> 15506 (first parameter => 0, second parameter => 1, etc.). 15507 </p></dd> 15508<dt><span class="term">Throws:</span></dt> 15509<dd><p> 15510 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current 15511 thread is interrupted. Any exception thrown by the <span class="emphasis"><em>wait 15512 callback</em></span> associated with any of the futures being waited 15513 for. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory could not 15514 be allocated for the internal wait structures. 15515 </p></dd> 15516<dt><span class="term">Notes:</span></dt> 15517<dd><p> 15518 <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code> 15519 is an <span class="emphasis"><em>interruption point</em></span>. 15520 </p></dd> 15521</dl> 15522</div> 15523</div> 15524<div class="section"> 15525<div class="titlepage"><div><div><h5 class="title"> 15526<a name="thread.synchronization.futures.reference.wait_for_all"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_all" title="Non-member function wait_for_all() - EXTENSION">Non-member 15527 function <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code> 15528 - EXTENSION</a> 15529</h5></div></div></div> 15530<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span> 15531 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15532 15533<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">></span> 15534 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15535 15536<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">></span> 15537 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15538 15539<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F4</span><span class="special">></span> 15540 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&</span> <span class="identifier">f4</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15541 15542<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F1</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F2</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F3</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F4</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">F5</span><span class="special">></span> 15543 <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&</span> <span class="identifier">f4</span><span class="special">,</span><span class="identifier">F5</span><span class="special">&</span> <span class="identifier">f5</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15544</pre> 15545<div class="variablelist"> 15546<p class="title"><b></b></p> 15547<dl class="variablelist"> 15548<dt><span class="term">Preconditions:</span></dt> 15549<dd><p> 15550 The types <code class="computeroutput"><span class="identifier">Fn</span></code> shall 15551 be specializations of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, and <code class="computeroutput"><span class="identifier">Iterator</span></code> shall be a forward iterator 15552 with a <code class="computeroutput"><span class="identifier">value_type</span></code> 15553 which is a specialization of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>. 15554 </p></dd> 15555<dt><span class="term">Effects:</span></dt> 15556<dd><p> 15557 Waits until all of the specified futures are <span class="emphasis"><em>ready</em></span>. 15558 </p></dd> 15559<dt><span class="term">Throws:</span></dt> 15560<dd><p> 15561 Any exceptions thrown by a call to <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> on the specified futures. 15562 </p></dd> 15563<dt><span class="term">Notes:</span></dt> 15564<dd><p> 15565 <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code> 15566 is an <span class="emphasis"><em>interruption point</em></span>. 15567 </p></dd> 15568</dl> 15569</div> 15570</div> 15571<div class="section"> 15572<div class="titlepage"><div><div><h5 class="title"> 15573<a name="thread.synchronization.futures.reference.when_all"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.when_all" title="Non-member function when_all() - EXTENSION">Non-member 15574 function <code class="computeroutput"><span class="identifier">when_all</span><span class="special">()</span></code> 15575 - EXTENSION</a> 15576</h5></div></div></div> 15577<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">></span> 15578 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>></span> 15579 <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span> 15580 15581<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FutTypes</span><span class="special">></span> 15582 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">FutTypes</span><span class="special">>...></span> <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">FutTypes</span><span class="special">&&...</span> <span class="identifier">futures</span><span class="special">);</span> 15583</pre> 15584<div class="variablelist"> 15585<p class="title"><b></b></p> 15586<dl class="variablelist"> 15587<dt><span class="term">Requires:</span></dt> 15588<dd><p> 15589 - For the first overload, <code class="computeroutput"><span class="identifier">InputIterator</span></code>'s 15590 value type shall be convertible to <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. All <code class="computeroutput"><span class="identifier">R</span></code> 15591 types must be the same. If any of the <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> objects are in invalid state 15592 (i.e. <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> 15593 <span class="special">==</span> <span class="keyword">false</span></code>), 15594 the behavior is undefined. - For the second overload, <code class="computeroutput"><span class="identifier">FutTypes</span></code> is of type <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> 15595 or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The effect of calling <code class="computeroutput"><span class="identifier">when_all</span></code> on a <code class="computeroutput"><span class="identifier">future</span></code> 15596 or a <code class="computeroutput"><span class="identifier">shared_future</span></code> 15597 object for which <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span> 15598 <span class="keyword">false</span></code> is undefined. 15599 </p></dd> 15600<dt><span class="term">Notes:</span></dt> 15601<dd> 15602<p> 15603 - There are two variations of <code class="computeroutput"><span class="identifier">when_all</span></code>. 15604 The first version takes a pair of <code class="computeroutput"><span class="identifier">InputIterators</span></code>. 15605 The second takes any arbitrary number of <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R0</span><span class="special">></span></code> and <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R1</span><span class="special">></span></code> objects, where <code class="computeroutput"><span class="identifier">R0</span></code> and <code class="computeroutput"><span class="identifier">R1</span></code> 15606 need not be the same type. 15607 </p> 15608<p> 15609 - Calling the first signature of <code class="computeroutput"><span class="identifier">when_all</span></code> 15610 where <code class="computeroutput"><span class="identifier">InputIterator</span></code> 15611 first equals last, returns a future with an empty <code class="computeroutput"><span class="identifier">vector</span></code> that is immediately ready. 15612 </p> 15613<p> 15614 - Calling the second signature of <code class="computeroutput"><span class="identifier">when_all</span></code> 15615 with no arguments returns a future<tuple<>> that is 15616 immediately ready. 15617 </p> 15618</dd> 15619<dt><span class="term">Effects:</span></dt> 15620<dd> 15621<p> 15622 - If any of the futures supplied to a call to <code class="computeroutput"><span class="identifier">when_all</span></code> 15623 refer to deferred tasks that have not started execution, those 15624 tasks are executed before the call to <code class="computeroutput"><span class="identifier">when_all</span></code> 15625 returns. Once all such tasks have been executed, the call to <code class="computeroutput"><span class="identifier">when_all</span></code> returns immediately. 15626 </p> 15627<p> 15628 - The call to <code class="computeroutput"><span class="identifier">when_all</span></code> 15629 does not wait for non-deferred tasks, or deferred tasks that have 15630 already started executing elsewhere, to complete before returning. 15631 </p> 15632<p> 15633 - Once all the <code class="computeroutput"><span class="identifier">future</span></code>s/<code class="computeroutput"><span class="identifier">shared_future</span></code>s supplied to the 15634 call to <code class="computeroutput"><span class="identifier">when_all</span></code> 15635 are ready, the <code class="computeroutput"><span class="identifier">future</span></code>s/<code class="computeroutput"><span class="identifier">shared_future</span></code>s are moved/copied 15636 into the associated state of the future returned from the call 15637 to <code class="computeroutput"><span class="identifier">when_all</span></code>, preserving 15638 the order of the futures supplied to <code class="computeroutput"><span class="identifier">when_all</span></code>. 15639 </p> 15640<p> 15641 - The collection is then stored as the result in a newly created 15642 shared state. 15643 </p> 15644<p> 15645 - A new future object that refers to the shared state is created. 15646 The exact type of the future is further described below. 15647 </p> 15648<p> 15649 - The <code class="computeroutput"><span class="identifier">future</span></code> returned 15650 by <code class="computeroutput"><span class="identifier">when_all</span></code> will 15651 not throw an exception when calling <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>, but the futures held in the 15652 output collection may. 15653 </p> 15654</dd> 15655<dt><span class="term">Returns:</span></dt> 15656<dd> 15657<p> 15658 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">tuple</span><span class="special"><>></span></code> 15659 if <code class="computeroutput"><span class="identifier">when_all</span></code> is 15660 called with zero arguments. 15661 </p> 15662<p> 15663 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>>></span></code> 15664 if the input cardinality is unknown at compile and the iterator 15665 pair yields <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The order of the futures in 15666 the output vector will be the same as given by the input iterator. 15667 </p> 15668<p> 15669 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>>></span></code> 15670 if the input cardinality is unknown at compile time and the iterator 15671 pair yields <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The order of the futures in 15672 the output vector will be the same as given by the input iterator. 15673 </p> 15674<p> 15675 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">FutTypes</span><span class="special">>...>></span></code> 15676 if inputs are fixed in number. 15677 </p> 15678</dd> 15679<dt><span class="term">Postconditions:</span></dt> 15680<dd> 15681<p> 15682 - All input futures valid() == false. 15683 </p> 15684<p> 15685 - All input shared future valid() == true. 15686 </p> 15687<p> 15688 - valid() == true. 15689 </p> 15690</dd> 15691</dl> 15692</div> 15693</div> 15694<div class="section"> 15695<div class="titlepage"><div><div><h5 class="title"> 15696<a name="thread.synchronization.futures.reference.when_any"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.when_any" title="Non-member function when_any() - EXTENSION">Non-member 15697 function <code class="computeroutput"><span class="identifier">when_any</span><span class="special">()</span></code> 15698 - EXTENSION</a> 15699</h5></div></div></div> 15700<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">></span> 15701 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">>></span> 15702 <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span> 15703 15704<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FutTypes</span><span class="special">></span> 15705 <span class="identifier">future</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">FutTypes</span><span class="special">>...></span> 15706 <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">FutTypes</span><span class="special">&&...</span> <span class="identifier">futures</span><span class="special">);</span> 15707</pre> 15708<div class="variablelist"> 15709<p class="title"><b></b></p> 15710<dl class="variablelist"> 15711<dt><span class="term">Requires:</span></dt> 15712<dd><p> 15713 - For the first overload, <code class="computeroutput"><span class="identifier">InputIterator</span></code>'s 15714 value type shall be convertible to <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. All <code class="computeroutput"><span class="identifier">R</span></code> 15715 types must be the same. If any of the <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> objects are in invalid state 15716 (i.e. <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> 15717 <span class="special">==</span> <span class="keyword">false</span></code>), 15718 the behavior is undefined. - For the second overload, <code class="computeroutput"><span class="identifier">FutTypes</span></code> is of type <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code> 15719 or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The effect of calling <code class="computeroutput"><span class="identifier">when_any</span></code> on a <code class="computeroutput"><span class="identifier">future</span></code> 15720 or a <code class="computeroutput"><span class="identifier">shared_future</span></code> 15721 object for which <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span> 15722 <span class="keyword">false</span> <span class="identifier">is</span> 15723 <span class="identifier">undefined</span></code>. 15724 </p></dd> 15725<dt><span class="term">Notes:</span></dt> 15726<dd> 15727<p> 15728 - There are two variations of <code class="computeroutput"><span class="identifier">when_any</span> 15729 </code>. The first version takes a pair of <code class="computeroutput"><span class="identifier">InputIterators</span></code>. 15730 The second takes any arbitrary number of <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R0</span><span class="special">></span></code> and <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R1</span><span class="special">></span></code> objects, where <code class="computeroutput"><span class="identifier">R0</span></code> and <code class="computeroutput"><span class="identifier">R1</span></code> 15731 need not be the same type. 15732 </p> 15733<p> 15734 - Calling the first signature of <code class="computeroutput"><span class="identifier">when_any</span> 15735 </code> where <code class="computeroutput"><span class="identifier">InputIterator</span></code> 15736 first equals last, returns a future with an empty <code class="computeroutput"><span class="identifier">vector</span></code> that is immediately ready. 15737 </p> 15738<p> 15739 - Calling the second signature of <code class="computeroutput"><span class="identifier">when_any</span></code> 15740 with no arguments returns a future<tuple<>> that is 15741 immediately ready. 15742 </p> 15743</dd> 15744<dt><span class="term">Effects:</span></dt> 15745<dd> 15746<p> 15747 - Each of the futures supplied to <code class="computeroutput"><span class="identifier">when_any</span></code> 15748 is checked in the order supplied. If a given future is ready, then 15749 no further futures are checked, and the call to <code class="computeroutput"><span class="identifier">when_any</span></code> 15750 returns immediately. If a given future refers to a deferred task 15751 that has not yet started execution, then no further futures are 15752 checked, that task is executed, and the call to <code class="computeroutput"><span class="identifier">when_any</span></code> 15753 then returns immediately. 15754 </p> 15755<p> 15756 - The call to <code class="computeroutput"><span class="identifier">when_any</span></code> 15757 does not wait for non-deferred tasks, or deferred tasks that have 15758 already started executing elsewhere, to complete before returning. 15759 </p> 15760<p> 15761 - Once at least one of the futures supplied to the call to <code class="computeroutput"><span class="identifier">when_any</span></code> are ready, the futures 15762 are moved into the associated state of the future returned from 15763 the call to <code class="computeroutput"><span class="identifier">when_any</span></code>, 15764 preserving the order of the futures supplied to <code class="computeroutput"><span class="identifier">when_any</span></code>. 15765 That future is then ready. 15766 </p> 15767<p> 15768 - The collection is then stored as the result in a newly created 15769 shared state. 15770 </p> 15771<p> 15772 - A new future object that refers to the shared state is created. 15773 The exact type of the future is further described below. 15774 </p> 15775<p> 15776 - The future returned by <code class="computeroutput"><span class="identifier">when_any</span></code> 15777 will not throw an exception when calling <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>, but the futures held in the 15778 output collection may. 15779 </p> 15780</dd> 15781<dt><span class="term">Returns:</span></dt> 15782<dd> 15783<p> 15784 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">tuple</span><span class="special"><>></span></code> 15785 if <code class="computeroutput"><span class="identifier">when_any</span> </code> is 15786 called with zero arguments. 15787 </p> 15788<p> 15789 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>>></span></code> 15790 if the input cardinality is unknown at compile and the iterator 15791 pair yields <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The order of the futures in 15792 the output vector will be the same as given by the input iterator. 15793 </p> 15794<p> 15795 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">>>></span></code> 15796 if the input cardinality is unknown at compile time and the iterator 15797 pair yields <code class="computeroutput"><span class="identifier">shared_future</span><span class="special"><</span><span class="identifier">R</span><span class="special">></span></code>. The order of the futures in 15798 the output vector will be the same as given by the input iterator. 15799 </p> 15800<p> 15801 - <code class="computeroutput"><span class="identifier">future</span><span class="special"><</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">decat_t</span><span class="special"><</span><span class="identifier">FutTypes</span><span class="special">>...>></span></code> 15802 if inputs are fixed in number. 15803 </p> 15804</dd> 15805<dt><span class="term">Postconditions:</span></dt> 15806<dd> 15807<p> 15808 - All input futures valid() == false. 15809 </p> 15810<p> 15811 - All input shared_futures valid() == true. 15812 </p> 15813<p> 15814 - valid() == true. 15815 </p> 15816</dd> 15817</dl> 15818</div> 15819</div> 15820<div class="section"> 15821<div class="titlepage"><div><div><h5 class="title"> 15822<a name="thread.synchronization.futures.reference.make_ready_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_ready_future" title="Non-member function make_ready_future() EXTENSION">Non-member 15823 function <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> EXTENSION</a> 15824</h5></div></div></div> 15825<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 15826 <span class="identifier">future</span><span class="special"><</span><span class="identifier">V</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15827<span class="identifier">future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 15828<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 15829 <span class="identifier">future</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// DEPRECATED</span> 15830<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 15831 <span class="identifier">future</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// DEPRECATED</span> 15832</pre> 15833<div class="variablelist"> 15834<p class="title"><b></b></p> 15835<dl class="variablelist"> 15836<dt><span class="term">Remark:</span></dt> 15837<dd><p> 15838 where <code class="computeroutput"><span class="identifier">V</span></code> is determined 15839 as follows: Let <code class="computeroutput"><span class="identifier">U</span></code> 15840 be <code class="computeroutput"><span class="identifier">decay_t</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>. 15841 Then <code class="computeroutput"><span class="identifier">V</span></code> is <code class="computeroutput"><span class="identifier">X</span><span class="special">&</span></code> 15842 if <code class="computeroutput"><span class="identifier">U</span></code> equals <code class="computeroutput"><span class="identifier">reference_wrapper</span><span class="special"><</span><span class="identifier">X</span><span class="special">></span></code>, 15843 otherwise <code class="computeroutput"><span class="identifier">V</span></code> is 15844 <code class="computeroutput"><span class="identifier">U</span></code>. 15845 </p></dd> 15846<dt><span class="term">Effects:</span></dt> 15847<dd> 15848<p> 15849 - value prototype: The value that is passed into the function is 15850 moved to the shared state of the returned future if it is an rvalue. 15851 Otherwise the value is copied to the shared state of the returned 15852 future. 15853 </p> 15854<p> 15855 - exception: The exception that is passed into the function is 15856 copied to the shared state of the returned future. 15857 </p> 15858<p> 15859 . 15860 </p> 15861</dd> 15862<dt><span class="term">Returns:</span></dt> 15863<dd> 15864<p> 15865 - a ready future with the value set with <code class="computeroutput"><span class="identifier">value</span></code> 15866 </p> 15867<p> 15868 - a ready future with the exception set with <code class="computeroutput"><span class="identifier">ex</span></code> 15869 </p> 15870<p> 15871 - a ready future<void> with the value set (void). 15872 </p> 15873</dd> 15874<dt><span class="term">Postcondition:</span></dt> 15875<dd> 15876<p> 15877 - Returned future, valid() == true 15878 </p> 15879<p> 15880 - Returned future, is_ready() = true 15881 </p> 15882<p> 15883 - Returned future, has_value() = true or has_exception() depending 15884 on the prototype. 15885 </p> 15886</dd> 15887</dl> 15888</div> 15889</div> 15890<div class="section"> 15891<div class="titlepage"><div><div><h5 class="title"> 15892<a name="thread.synchronization.futures.reference.make_exceptional_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_exceptional_future" title="Non-member function make_exceptional_future() EXTENSION">Non-member 15893 function <code class="computeroutput"><span class="identifier">make_exceptional_future</span><span class="special">()</span></code> EXTENSION</a> 15894</h5></div></div></div> 15895<pre class="programlisting"><span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15896<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">></span> 15897 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span> <span class="comment">// EXTENSION</span> 15898<span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">();</span> <span class="comment">// EXTENSION</span> 15899</pre> 15900<div class="variablelist"> 15901<p class="title"><b></b></p> 15902<dl class="variablelist"> 15903<dt><span class="term">Effects:</span></dt> 15904<dd><p> 15905 The exception that is passed in to the function or the current 15906 exception if no parameter is given is moved into the returned 15907 <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> 15908 if it is an rvalue. Otherwise the exception is copied into the 15909 returned <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>. 15910 </p></dd> 15911<dt><span class="term">Returns:</span></dt> 15912<dd><p> 15913 An exceptional_ptr instance implicitly convertible to a future<T> 15914 </p></dd> 15915</dl> 15916</div> 15917</div> 15918<div class="section"> 15919<div class="titlepage"><div><div><h5 class="title"> 15920<a name="thread.synchronization.futures.reference.make_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_future" title="Non-member function make_future() DEPRECATED">Non-member 15921 function <code class="computeroutput"><span class="identifier">make_future</span><span class="special">()</span></code> 15922 DEPRECATED</a> 15923</h5></div></div></div> 15924<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 15925 <span class="identifier">future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// DEPRECATED</span> 15926<span class="identifier">future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_future</span><span class="special">();</span> <span class="comment">// DEPRECATED</span> 15927</pre> 15928<div class="variablelist"> 15929<p class="title"><b></b></p> 15930<dl class="variablelist"> 15931<dt><span class="term">Effects:</span></dt> 15932<dd><p> 15933 The value that is passed into the function is moved to the shared 15934 state of the returned function if it is an rvalue. Otherwise the 15935 value is copied to the shared state of the returned function. . 15936 </p></dd> 15937<dt><span class="term">Returns:</span></dt> 15938<dd> 15939<p> 15940 - future<T>, if function is given a value of type T 15941 </p> 15942<p> 15943 - future<void>, if the function is not given any inputs. 15944 </p> 15945</dd> 15946<dt><span class="term">Postcondition:</span></dt> 15947<dd> 15948<p> 15949 - Returned future<T>, valid() == true 15950 </p> 15951<p> 15952 - Returned future<T>, is_ready() = true 15953 </p> 15954</dd> 15955<dt><span class="term">See:</span></dt> 15956<dd><p> 15957 <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> 15958 </p></dd> 15959</dl> 15960</div> 15961</div> 15962<div class="section"> 15963<div class="titlepage"><div><div><h5 class="title"> 15964<a name="thread.synchronization.futures.reference.make_shared_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_shared_future" title="Non-member function make_shared_future() DEPRECATED">Non-member 15965 function <code class="computeroutput"><span class="identifier">make_shared_future</span><span class="special">()</span></code> DEPRECATED</a> 15966</h5></div></div></div> 15967<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 15968 <span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="identifier">make_shared_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&&</span> <span class="identifier">value</span><span class="special">);</span> <span class="comment">// DEPRECATED</span> 15969<span class="identifier">shared_future</span><span class="special"><</span><span class="keyword">void</span><span class="special">></span> <span class="identifier">make_shared_future</span><span class="special">();</span> <span class="comment">// DEPRECATED</span> 15970</pre> 15971<div class="variablelist"> 15972<p class="title"><b></b></p> 15973<dl class="variablelist"> 15974<dt><span class="term">Effects:</span></dt> 15975<dd><p> 15976 The value that is passed in to the function is moved to the shared 15977 state of the returned function if it is an rvalue. Otherwise the 15978 value is copied to the shared state of the returned function. . 15979 </p></dd> 15980<dt><span class="term">Returns:</span></dt> 15981<dd> 15982<p> 15983 - shared_future<T>, if function is given a value of type 15984 T 15985 </p> 15986<p> 15987 - shared_future<void>, if the function is not given any inputs. 15988 </p> 15989</dd> 15990<dt><span class="term">Postcondition:</span></dt> 15991<dd> 15992<p> 15993 - Returned shared_future<T>, valid() == true 15994 </p> 15995<p> 15996 - Returned shared_future<T>, is_ready() = true 15997 </p> 15998</dd> 15999<dt><span class="term">See:</span></dt> 16000<dd><p> 16001 <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">future</span><span class="special"><>::</span><span class="identifier">share</span><span class="special">()</span></code> 16002 </p></dd> 16003</dl> 16004</div> 16005</div> 16006</div> 16007</div> 16008</div> 16009<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 16010<td align="left"></td> 16011<td align="right"><div class="copyright-footer">Copyright © 2007 -11 Anthony Williams<br>Copyright © 2011 -17 Vicente J. Botet Escriba<p> 16012 Distributed under the Boost Software License, Version 1.0. (See accompanying 16013 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>) 16014 </p> 16015</div></td> 16016</tr></table> 16017<hr> 16018<div class="spirit-nav"> 16019<a accesskey="p" href="ScopedThreads.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="thread_local_storage.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 16020</div> 16021</body> 16022</html> 16023