Imported Upstream version 1.57.0
[platform/upstream/boost.git] / doc / html / thread / synchronization.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Synchronization</title>
5 <link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
7 <link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
8 <link rel="up" href="../thread.html" title="Chapter&#160;30.&#160;Thread 4.4.0">
9 <link rel="prev" href="ScopedThreads.html" title="Scoped Threads">
10 <link rel="next" href="thread_local_storage.html" title="Thread Local Storage">
11 </head>
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
15 <td align="center"><a href="../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../more/index.htm">More</a></td>
20 </tr></table>
21 <hr>
22 <div class="spirit-nav">
23 <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>
24 </div>
25 <div class="section">
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="thread.synchronization"></a><a class="link" href="synchronization.html" title="Synchronization">Synchronization</a>
28 </h2></div></div></div>
29 <div class="toc"><dl class="toc">
30 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial">Tutorial</a></span></dt>
31 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts">Mutex Concepts</a></span></dt>
32 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_option">Lock Options</a></span></dt>
33 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard">Lock Guard</a></span></dt>
34 <dt><span class="section"><a href="synchronization.html#thread.synchronization.with_lock_guard">With Lock Guard</a></span></dt>
35 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts">Lock Concepts</a></span></dt>
36 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks">Lock Types</a></span></dt>
37 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks">Other Lock Types
38       - EXTENSION</a></span></dt>
39 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions">Lock functions</a></span></dt>
40 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories">Lock Factories
41       - EXTENSION</a></span></dt>
42 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types">Mutex Types</a></span></dt>
43 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref">Condition Variables</a></span></dt>
44 <dt><span class="section"><a href="synchronization.html#thread.synchronization.once">One-time Initialization</a></span></dt>
45 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers">Barriers -- EXTENSION</a></span></dt>
46 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches">Latches -- EXPERIMENTAL</a></span></dt>
47 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors">Executors and Schedulers
48       -- EXPERIMENTAL</a></span></dt>
49 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures">Futures</a></span></dt>
50 </dl></div>
51 <div class="section">
52 <div class="titlepage"><div><div><h3 class="title">
53 <a name="thread.synchronization.tutorial"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial" title="Tutorial">Tutorial</a>
54 </h3></div></div></div>
55 <div class="toc"><dl class="toc">
56 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking">Internal
57         Locking</a></span></dt>
58 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes">External
59         Locking -- <code class="computeroutput"><span class="identifier">strict_lock</span></code> and
60         <code class="computeroutput"><span class="identifier">externally_locked</span></code> classes</a></span></dt>
61 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.with">Executing Around
62         a Function</a></span></dt>
63 </dl></div>
64 <p>
65         <a href="http://home.roadrunner.com/~hinnant/mutexes/locking.html" target="_top">Handling
66         mutexes in C++</a> is an excellent tutorial. You need just replace std
67         and ting by boost.
68       </p>
69 <p>
70         <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html" target="_top">Mutex,
71         Lock, Condition Variable Rationale</a> adds rationale for the design
72         decisions made for mutexes, locks and condition variables.
73       </p>
74 <p>
75         In addition to the C++11 standard locks, Boost.Thread provides other locks
76         and some utilities that help the user to make their code thread-safe.
77       </p>
78 <div class="section">
79 <div class="titlepage"><div><div><h4 class="title">
80 <a name="thread.synchronization.tutorial.internal_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking" title="Internal Locking">Internal
81         Locking</a>
82 </h4></div></div></div>
83 <div class="toc"><dl class="toc">
84 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution">Concurrent
85           threads of execution</a></span></dt>
86 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_locking">Internal
87           locking</a></span></dt>
88 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_and_external_locking">Internal
89           and external locking</a></span></dt>
90 </dl></div>
91 <div class="note"><table border="0" summary="Note">
92 <tr>
93 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
94 <th align="left">Note</th>
95 </tr>
96 <tr><td align="left" valign="top"><p>
97             This tutorial is an adaptation of chapter Concurrency of the Object-Oriented
98             Programming in the BETA Programming Language and of the paper of Andrei
99             Alexandrescu "Multithreading and the C++ Type System" to the
100             Boost library.
101           </p></td></tr>
102 </table></div>
103 <div class="section">
104 <div class="titlepage"><div><div><h5 class="title">
105 <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
106           threads of execution</a>
107 </h5></div></div></div>
108 <p>
109             Consider, for example, modeling a bank account class that supports simultaneous
110             deposits and withdrawals from multiple locations (arguably the "Hello,
111             World" of multithreaded programming).
112           </p>
113 <p>
114             From here a component is a model of the <code class="computeroutput"><span class="identifier">Callable</span></code>
115             concept.
116           </p>
117 <p>
118             I C++11 (Boost) concurrent execution of a component is obtained by means
119             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>):
120           </p>
121 <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>
122 </pre>
123 <p>
124             where <code class="computeroutput"><span class="identifier">S</span></code> is a model of
125             <code class="computeroutput"><span class="identifier">Callable</span></code>. The meaning
126             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
127             current thread of execution executing the expression.
128           </p>
129 <p>
130             The following example includes a bank account of a person (Joe) and two
131             components, one corresponding to a bank agent depositing money in Joe's
132             account, and one representing Joe. Joe will only be withdrawing money
133             from the account:
134           </p>
135 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span><span class="special">;</span>
136
137 <span class="identifier">BankAccount</span> <span class="identifier">JoesAccount</span><span class="special">;</span>
138
139 <span class="keyword">void</span> <span class="identifier">bankAgent</span><span class="special">()</span>
140 <span class="special">{</span>
141     <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">&gt;</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>
142         <span class="comment">//...</span>
143         <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>
144         <span class="comment">//...</span>
145     <span class="special">}</span>
146 <span class="special">}</span>
147
148 <span class="keyword">void</span> <span class="identifier">Joe</span><span class="special">()</span> <span class="special">{</span>
149     <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">&gt;</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>
150         <span class="comment">//...</span>
151         <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>
152         <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">myPocket</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
153         <span class="comment">//...</span>
154     <span class="special">}</span>
155 <span class="special">}</span>
156
157 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
158     <span class="comment">//...</span>
159     <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>
160     <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>
161     <span class="identifier">thread1</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
162     <span class="identifier">thread2</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
163     <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
164 <span class="special">}</span>
165 </pre>
166 <p>
167             From time to time, the <code class="computeroutput"><span class="identifier">bankAgent</span></code>
168             will deposit $500 in <code class="computeroutput"><span class="identifier">JoesAccount</span></code>.
169             <code class="computeroutput"><span class="identifier">Joe</span></code> will similarly withdraw
170             $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>
171             are executed concurrently.
172           </p>
173 </div>
174 <div class="section">
175 <div class="titlepage"><div><div><h5 class="title">
176 <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
177           locking</a>
178 </h5></div></div></div>
179 <p>
180             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>
181             doesn't access <code class="computeroutput"><span class="identifier">JoesAccount</span></code>
182             at the same time. There is, however, no guarantee that this will not
183             happen. We may use a mutex to guarantee exclusive access to each bank.
184           </p>
185 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
186     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span>
187     <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
188 <span class="keyword">public</span><span class="special">:</span>
189     <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>
190         <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
191         <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
192         <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
193     <span class="special">}</span>
194     <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>
195         <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
196         <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
197         <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
198     <span class="special">}</span>
199     <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
200         <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
201         <span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">balance_</span><span class="special">;</span>
202         <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
203         <span class="keyword">return</span> <span class="identifier">b</span><span class="special">;</span>
204     <span class="special">}</span>
205 <span class="special">};</span>
206 </pre>
207 <p>
208             Execution of the <code class="computeroutput"><span class="identifier">Deposit</span></code>
209             and <code class="computeroutput"><span class="identifier">Withdraw</span></code> operations
210             will no longer be able to make simultaneous access to balance.
211           </p>
212 <p>
213             A mutex is a simple and basic mechanism for obtaining synchronization.
214             In the above example it is relatively easy to be convinced that the synchronization
215             works correctly (in the absence of exception). In a system with several
216             concurrent objects and several shared objects, it may be difficult to
217             describe synchronization by means of mutexes. Programs that make heavy
218             use of mutexes may be difficult to read and write. Instead, we shall
219             introduce a number of generic classes for handling more complicated forms
220             of synchronization and communication.
221           </p>
222 <p>
223             With the RAII idiom we can simplify a lot this using the scoped locks.
224             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
225             <code class="computeroutput"><span class="identifier">mtx_</span></code>.
226           </p>
227 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
228     <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>
229     <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
230 <span class="keyword">public</span><span class="special">:</span>
231     <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>
232         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
233         <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
234     <span class="special">}</span>
235     <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>
236         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
237         <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
238     <span class="special">}</span>
239     <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
240         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
241         <span class="keyword">return</span> <span class="identifier">balance_</span><span class="special">;</span>
242     <span class="special">}</span>
243 <span class="special">};</span>
244 </pre>
245 <p>
246             The object-level locking idiom doesn't cover the entire richness of a
247             threading model. For example, the model above is quite deadlock-prone
248             when you try to coordinate multi-object transactions. Nonetheless, object-level
249             locking is useful in many cases, and in combination with other mechanisms
250             can provide a satisfactory solution to many threaded access problems
251             in object-oriented programs.
252           </p>
253 </div>
254 <div class="section">
255 <div class="titlepage"><div><div><h5 class="title">
256 <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
257           and external locking</a>
258 </h5></div></div></div>
259 <p>
260             The BankAccount class above uses internal locking. Basically, a class
261             that uses internal locking guarantees that any concurrent calls to its
262             public member functions don't corrupt an instance of that class. This
263             is typically ensured by having each public member function acquire a
264             lock on the object upon entry. This way, for any given object of that
265             class, there can be only one member function call active at any moment,
266             so the operations are nicely serialized.
267           </p>
268 <p>
269             This approach is reasonably easy to implement and has an attractive simplicity.
270             Unfortunately, "simple" might sometimes morph into "simplistic."
271           </p>
272 <p>
273             Internal locking is insufficient for many real-world synchronization
274             tasks. Imagine that you want to implement an ATM withdrawal transaction
275             with the BankAccount class. The requirements are simple. The ATM transaction
276             consists of two withdrawals-one for the actual money and one for the
277             $2 commission. The two withdrawals must appear in strict sequence; that
278             is, no other transaction can exist between them.
279           </p>
280 <p>
281             The obvious implementation is erratic:
282           </p>
283 <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">&amp;</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>
284     <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>
285     <span class="comment">// preemption possible</span>
286     <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>
287 <span class="special">}</span>
288 </pre>
289 <p>
290             The problem is that between the two calls above, another thread can perform
291             another operation on the account, thus breaking the second design requirement.
292           </p>
293 <p>
294             In an attempt to solve this problem, let's lock the account from the
295             outside during the two operations:
296           </p>
297 <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">&amp;</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>
298     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</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>
299     <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>
300     <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>
301 <span class="special">}</span>
302 </pre>
303 <p>
304             Notice that the code above doesn't compile, the <code class="computeroutput"><span class="identifier">mtx_</span></code>
305             field is private. We have two possibilities:
306           </p>
307 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
308 <li class="listitem">
309                 make <code class="computeroutput"><span class="identifier">mtx_</span></code> public
310                 which seems odd
311               </li>
312 <li class="listitem">
313                 make the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
314                 lockable by adding the lock/unlock functions
315               </li>
316 </ul></div>
317 <p>
318             We can add these functions explicitly
319           </p>
320 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
321     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span>
322     <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
323 <span class="keyword">public</span><span class="special">:</span>
324     <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>
325         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
326         <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
327     <span class="special">}</span>
328     <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>
329         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">mtx_</span><span class="special">);</span>
330         <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
331     <span class="special">}</span>
332     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">()</span> <span class="special">{</span>
333         <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
334     <span class="special">}</span>
335     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">()</span> <span class="special">{</span>
336         <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
337     <span class="special">}</span>
338 <span class="special">};</span>
339 </pre>
340 <p>
341             or inheriting from a class which add these lockable functions.
342           </p>
343 <p>
344             The <code class="computeroutput"><span class="identifier">basic_lockable_adapter</span></code>
345             class helps to define the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
346             class as
347           </p>
348 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
349 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;</span>
350 <span class="special">{</span>
351     <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
352 <span class="keyword">public</span><span class="special">:</span>
353     <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>
354         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
355         <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
356     <span class="special">}</span>
357     <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>
358         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
359         <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
360     <span class="special">}</span>
361     <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
362         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
363         <span class="keyword">return</span> <span class="identifier">balance_</span><span class="special">;</span>
364     <span class="special">}</span>
365 <span class="special">};</span>
366 </pre>
367 <p>
368             and the code that doesn't compiles becomes
369           </p>
370 <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">&amp;</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>
371     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">acct</span><span class="special">);</span>
372     <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>
373     <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>
374 <span class="special">}</span>
375 </pre>
376 <p>
377             Notice that now acct is being locked by Withdraw after it has already
378             been locked by guard. When running such code, one of two things happens.
379           </p>
380 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
381 <li class="listitem">
382                 Your mutex implementation might support the so-called recursive mutex
383                 semantics. This means that the same thread can lock the same mutex
384                 several times successfully. In this case, the implementation works
385                 but has a performance overhead due to unnecessary locking. (The locking/unlocking
386                 sequence in the two Withdraw calls is not needed but performed anyway-and
387                 that costs time.)
388               </li>
389 <li class="listitem">
390                 Your mutex implementation might not support recursive locking, which
391                 means that as soon as you try to acquire it the second time, it blocks-so
392                 the ATMWithdrawal function enters the dreaded deadlock.
393               </li>
394 </ul></div>
395 <p>
396             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
397             use its recursive version <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code>.
398           </p>
399 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
400 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">recursive_mutex</span><span class="special">&gt;</span>
401 <span class="special">{</span>
402
403     <span class="comment">// ...</span>
404 <span class="special">};</span>
405 </pre>
406 <p>
407             The caller-ensured locking approach is more flexible and the most efficient,
408             but very dangerous. In an implementation using caller-ensured locking,
409             BankAccount still holds a mutex, but its member functions don't manipulate
410             it at all. Deposit and Withdraw are not thread-safe anymore. Instead,
411             the client code is responsible for locking BankAccount properly.
412           </p>
413 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
414     <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="special">{</span>
415     <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
416 <span class="keyword">public</span><span class="special">:</span>
417     <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>
418         <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
419     <span class="special">}</span>
420     <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>
421         <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
422     <span class="special">}</span>
423 <span class="special">};</span>
424 </pre>
425 <p>
426             Obviously, the caller-ensured locking approach has a safety problem.
427             BankAccount's implementation code is finite, and easy to reach and maintain,
428             but there's an unbounded amount of client code that manipulates BankAccount
429             objects. In designing applications, it's important to differentiate between
430             requirements imposed on bounded code and unbounded code. If your class
431             makes undue requirements on unbounded code, that's usually a sign that
432             encapsulation is out the window.
433           </p>
434 <p>
435             To conclude, if in designing a multi-threaded class you settle on internal
436             locking, you expose yourself to inefficiency or deadlocks. On the other
437             hand, if you rely on caller-provided locking, you make your class error-prone
438             and difficult to use. Finally, external locking completely avoids the
439             issue by leaving it all to the client code.
440           </p>
441 </div>
442 </div>
443 <div class="section">
444 <div class="titlepage"><div><div><h4 class="title">
445 <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
446         Locking -- <code class="computeroutput"><span class="identifier">strict_lock</span></code> and
447         <code class="computeroutput"><span class="identifier">externally_locked</span></code> classes</a>
448 </h4></div></div></div>
449 <div class="toc"><dl class="toc">
450 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits">Locks
451           as permits</a></span></dt>
452 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking">Improving
453           External Locking</a></span></dt>
454 <dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks">Allowing
455           other strict locks</a></span></dt>
456 </dl></div>
457 <div class="note"><table border="0" summary="Note">
458 <tr>
459 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
460 <th align="left">Note</th>
461 </tr>
462 <tr><td align="left" valign="top"><p>
463             This tutorial is an adaptation of the paper by Andrei Alexandrescu "Multithreading
464             and the C++ Type System" to the Boost library.
465           </p></td></tr>
466 </table></div>
467 <div class="section">
468 <div class="titlepage"><div><div><h5 class="title">
469 <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
470           as permits</a>
471 </h5></div></div></div>
472 <p>
473             So what to do? Ideally, the BankAccount class should do the following:
474           </p>
475 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
476 <li class="listitem">
477                 Support both locking models (internal and external).
478               </li>
479 <li class="listitem">
480                 Be efficient; that is, use no unnecessary locking.
481               </li>
482 <li class="listitem">
483                 Be safe; that is, BankAccount objects cannot be manipulated without
484                 appropriate locking.
485               </li>
486 </ul></div>
487 <p>
488             Let's make a worthwhile observation: Whenever you lock a BankAccount,
489             you do so by using a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code> object. Turning this statement around,
490             wherever there's a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>, there's also a locked <code class="computeroutput"><span class="identifier">BankAccount</span></code> somewhere. Thus, you can
491             think of-and use-a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code> object as a permit. Owning a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
492             gives you rights to do certain things. The <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code> object should not be copied or aliased
493             (it's not a transmissible permit).
494           </p>
495 <div class="orderedlist"><ol class="orderedlist" type="1">
496 <li class="listitem">
497                 As long as a permit is still alive, the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
498                 object stays locked.
499               </li>
500 <li class="listitem">
501                 When the <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code> is destroyed, the <code class="computeroutput"><span class="identifier">BankAccount</span></code>'s mutex is released.
502               </li>
503 </ol></div>
504 <p>
505             The net effect is that at any point in your code, having access to a
506             <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
507             object guarantees that a <code class="computeroutput"><span class="identifier">BankAccount</span></code>
508             is locked. (You don't know exactly which <code class="computeroutput"><span class="identifier">BankAccount</span></code>
509             is locked, however-an issue that we'll address soon.)
510           </p>
511 <p>
512             For now, let's make a couple of enhancements to the <code class="computeroutput"><span class="identifier">lock_guard</span></code>
513             class template defined in Boost.Thread. We'll call the enhanced version
514             <code class="computeroutput"><span class="identifier">strict_lock</span></code>. Essentially,
515             a <code class="computeroutput"><span class="identifier">strict_lock</span></code>'s role
516             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
517             and non-alias policy. <code class="computeroutput"><span class="identifier">strict_lock</span></code>
518             disables copying by making the copy constructor and the assignment operator
519             private.
520           </p>
521 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
522 <span class="keyword">class</span> <span class="identifier">strict_lock</span>  <span class="special">{</span>
523 <span class="keyword">public</span><span class="special">:</span>
524     <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">lockable_type</span><span class="special">;</span>
525
526
527     <span class="keyword">explicit</span> <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">lockable_type</span><span class="special">&amp;</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>
528         <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>
529     <span class="special">}</span>
530     <span class="identifier">strict_lock</span><span class="special">()</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
531     <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
532     <span class="identifier">strict_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
533
534     <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>
535
536     <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>
537     <span class="special">{</span>
538       <span class="keyword">return</span> <span class="identifier">l</span> <span class="special">==</span> <span class="special">&amp;</span><span class="identifier">obj_</span><span class="special">;</span>
539     <span class="special">}</span>
540 <span class="keyword">private</span><span class="special">:</span>
541     <span class="identifier">lockable_type</span><span class="special">&amp;</span> <span class="identifier">obj_</span><span class="special">;</span>
542 <span class="special">};</span>
543 </pre>
544 <p>
545             Silence can be sometimes louder than words-what's forbidden to do with
546             a <code class="computeroutput"><span class="identifier">strict_lock</span></code> is as important
547             as what you can do. Let's see what you can and what you cannot do with
548             a <code class="computeroutput"><span class="identifier">strict_lock</span></code> instantiation:
549           </p>
550 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
551                 You can create a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> only starting from a valid T
552                 object. Notice that there is no other way you can create a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>.
553               </li></ul></div>
554 <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>
555 <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span> <span class="identifier">myLock</span><span class="special">(</span><span class="identifier">myAccount</span><span class="special">);</span> <span class="comment">// ok</span>
556 </pre>
557 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
558                 You cannot copy <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
559                 to one another. In particular, you cannot pass <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
560                 by value to functions or have them returned by functions:
561               </li></ul></div>
562 <pre class="programlisting"><span class="keyword">extern</span> <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span> <span class="identifier">Foo</span><span class="special">();</span> <span class="comment">// compile-time error</span>
563 <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">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;);</span> <span class="comment">// compile-time error</span>
564 </pre>
565 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
566                 However, you still can pass <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
567                 by reference to and from functions:
568               </li></ul></div>
569 <pre class="programlisting"><span class="comment">// ok, Foo returns a reference to strict_lock&lt;BankAccount&gt;</span>
570 <span class="keyword">extern</span> <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;</span> <span class="identifier">Foo</span><span class="special">();</span>
571 <span class="comment">// ok, Bar takes a reference to strict_lock&lt;BankAccount&gt;</span>
572 <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">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;);</span>
573 </pre>
574 <p>
575             All these rules were put in place with one purpose-enforcing that owning
576             a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
577             is a reasonably strong guarantee that
578           </p>
579 <div class="orderedlist"><ol class="orderedlist" type="1">
580 <li class="listitem">
581                 you locked a T object, and
582               </li>
583 <li class="listitem">
584                 that object will be unlocked at a later point.
585               </li>
586 </ol></div>
587 <p>
588             Now that we have such a strict <code class="computeroutput"><span class="identifier">strict_lock</span></code>,
589             how do we harness its power in defining a safe, flexible interface for
590             BankAccount? The idea is as follows:
591           </p>
592 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
593 <li class="listitem">
594                 Each of BankAccount's interface functions (in our case, Deposit and
595                 Withdraw) comes in two overloaded variants.
596               </li>
597 <li class="listitem">
598                 One version keeps the same signature as before, and the other takes
599                 an additional argument of type <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>. The first version is internally
600                 locked; the second one requires external locking. External locking
601                 is enforced at compile time by requiring client code to create a
602                 <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
603                 object.
604               </li>
605 <li class="listitem">
606                 BankAccount avoids code bloating by having the internal locked functions
607                 forward to the external locked functions, which do the actual job.
608               </li>
609 </ul></div>
610 <p>
611             A little code is worth 1,000 words, a (hacked into) saying goes, so here's
612             the new BankAccount class:
613           </p>
614 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
615 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">recursive_mutex</span><span class="special">&gt;</span>
616 <span class="special">{</span>
617     <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
618 <span class="keyword">public</span><span class="special">:</span>
619     <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">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span> <span class="special">{</span>
620         <span class="comment">// Externally locked</span>
621         <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
622     <span class="special">}</span>
623     <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>
624         <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">mutex</span><span class="special">&gt;</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>
625         <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>
626     <span class="special">}</span>
627     <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">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span> <span class="special">{</span>
628         <span class="comment">// Externally locked</span>
629         <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
630     <span class="special">}</span>
631     <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>
632         <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">:</span><span class="identifier">mutex</span><span class="special">&gt;</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>
633         <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>
634     <span class="special">}</span>
635 <span class="special">};</span>
636 </pre>
637 <p>
638             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
639             <code class="computeroutput"><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>.
640             If you want to use external locking, you lock the object by constructing
641             a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
642             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>
643             <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span></code>
644             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">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span></code>.
645             For example, here's the <code class="computeroutput"><span class="identifier">ATMWithdrawal</span></code>
646             function implemented correctly:
647           </p>
648 <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">&amp;</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>
649     <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">acct</span><span class="special">);</span>
650     <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>
651     <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>
652 <span class="special">}</span>
653 </pre>
654 <p>
655             This function has the best of both worlds-it's reasonably safe and efficient
656             at the same time.
657           </p>
658 <p>
659             It's worth noting that <code class="computeroutput"><span class="identifier">strict_lock</span></code>
660             being a template gives extra safety compared to a straight polymorphic
661             approach. In such a design, BankAccount would derive from a Lockable
662             interface. <code class="computeroutput"><span class="identifier">strict_lock</span></code>
663             would manipulate Lockable references so there's no need for templates.
664             This approach is sound; however, it provides fewer compile-time guarantees.
665             Having a <code class="computeroutput"><span class="identifier">strict_lock</span></code>
666             object would only tell that some object derived from Lockable is currently
667             locked. In the templated approach, having a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code> gives a stronger guarantee-it's a
668             <code class="computeroutput"><span class="identifier">BankAccount</span></code> that stays
669             locked.
670           </p>
671 <p>
672             There's a weasel word in there-I mentioned that ATMWithdrawal is reasonably
673             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">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
674             object locks the appropriate BankAccount object. The type system only
675             ensures that some BankAccount object is locked. For example, consider
676             the following phony implementation of ATMWithdrawal:
677           </p>
678 <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">&amp;</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>
679     <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>
680     <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">fakeAcct</span><span class="special">);</span>
681     <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>
682     <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>
683 <span class="special">}</span>
684 </pre>
685 <p>
686             This code compiles warning-free but obviously doesn't do the right thing-it
687             locks one account and uses another.
688           </p>
689 <p>
690             It's important to understand what can be enforced within the realm of
691             the C++ type system and what needs to be enforced at runtime. The mechanism
692             we've put in place so far ensures that some BankAccount object is locked
693             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>
694             <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span></code>.
695             We must enforce at runtime exactly what object is locked.
696           </p>
697 <p>
698             If our scheme still needs runtime checks, how is it useful? An unwary
699             or malicious programmer can easily lock the wrong object and manipulate
700             any BankAccount without actually locking it.
701           </p>
702 <p>
703             First, let's get the malice issue out of the way. C is a language that
704             requires a lot of attention and discipline from the programmer. C++ made
705             some progress by asking a little less of those, while still fundamentally
706             trusting the programmer. These languages are not concerned with malice
707             (as Java is, for example). After all, you can break any C/C++ design
708             simply by using casts "appropriately" (if appropriately is
709             an, er, appropriate word in this context).
710           </p>
711 <p>
712             The scheme is useful because the likelihood of a programmer forgetting
713             about any locking whatsoever is much greater than the likelihood of a
714             programmer who does remember about locking, but locks the wrong object.
715           </p>
716 <p>
717             Using <code class="computeroutput"><span class="identifier">strict_lock</span></code> permits
718             compile-time checking of the most common source of errors, and runtime
719             checking of the less frequent problem.
720           </p>
721 <p>
722             Let's see how to enforce that the appropriate BankAccount object is locked.
723             First, we need to add a member function to the <code class="computeroutput"><span class="identifier">strict_lock</span></code>
724             class template. The <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">Loclable</span><span class="special">*)</span></code>
725             function returns a reference to the locked object.
726           </p>
727 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">strict_lock</span> <span class="special">{</span>
728     <span class="special">...</span> <span class="identifier">as</span> <span class="identifier">before</span> <span class="special">...</span>
729 <span class="keyword">public</span><span class="special">:</span>
730     <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">==&amp;</span><span class="identifier">obj_</span><span class="special">;</span> <span class="special">}</span>
731 <span class="special">};</span>
732 </pre>
733 <p>
734             Second, BankAccount needs to use this function compare the locked object
735             against this:
736           </p>
737 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
738 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span><span class="special">&gt;</span>
739     <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
740 <span class="keyword">public</span><span class="special">:</span>
741     <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">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;</span> <span class="identifier">guard</span><span class="special">)</span> <span class="special">{</span>
742         <span class="comment">// Externally locked</span>
743         <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>
744             <span class="keyword">throw</span> <span class="string">"Locking Error: Wrong Object Locked"</span><span class="special">;</span>
745         <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
746     <span class="special">}</span>
747 <span class="comment">// ...</span>
748 <span class="special">};</span>
749 </pre>
750 <p>
751             The overhead incurred by the test above is much lower than locking a
752             recursive mutex for the second time.
753           </p>
754 </div>
755 <div class="section">
756 <div class="titlepage"><div><div><h5 class="title">
757 <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
758           External Locking</a>
759 </h5></div></div></div>
760 <p>
761             Now let's assume that BankAccount doesn't use its own locking at all,
762             and has only a thread-neutral implementation:
763           </p>
764 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
765     <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
766 <span class="keyword">public</span><span class="special">:</span>
767     <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>
768         <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
769     <span class="special">}</span>
770     <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>
771         <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
772     <span class="special">}</span>
773 <span class="special">};</span>
774 </pre>
775 <p>
776             Now you can use BankAccount in single-threaded and multi-threaded applications
777             alike, but you need to provide your own synchronization in the latter
778             case.
779           </p>
780 <p>
781             Say we have an AccountManager class that holds and manipulates a BankAccount
782             object:
783           </p>
784 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">AccountManager</span>
785 <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span>
786 <span class="special">{</span>
787     <span class="identifier">BankAccount</span> <span class="identifier">checkingAcct_</span><span class="special">;</span>
788     <span class="identifier">BankAccount</span> <span class="identifier">savingsAcct_</span><span class="special">;</span>
789     <span class="special">...</span>
790 <span class="special">};</span>
791 </pre>
792 <p>
793             Let's also assume that, by design, AccountManager must stay locked while
794             accessing its BankAccount members. The question is, how can we express
795             this design constraint using the C++ type system? How can we state "You
796             have access to this BankAccount object only after locking its parent
797             AccountManager object"?
798           </p>
799 <p>
800             The solution is to use a little bridge template <code class="computeroutput"><span class="identifier">externally_locked</span></code>
801             that controls access to a BankAccount.
802           </p>
803 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
804 <span class="keyword">class</span> <span class="identifier">externally_locked</span> <span class="special">{</span>
805     <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">LockableConcept</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;));</span>
806
807 <span class="keyword">public</span><span class="special">:</span>
808     <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">obj</span><span class="special">,</span> <span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">lockable</span><span class="special">)</span>
809         <span class="special">:</span> <span class="identifier">obj_</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span>
810         <span class="special">,</span> <span class="identifier">lockable_</span><span class="special">(</span><span class="identifier">lockable</span><span class="special">)</span>
811     <span class="special">{}</span>
812
813     <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">lockable</span><span class="special">)</span>
814         <span class="special">:</span> <span class="identifier">obj_</span><span class="special">()</span>
815         <span class="special">,</span> <span class="identifier">lockable_</span><span class="special">(</span><span class="identifier">lockable</span><span class="special">)</span>
816     <span class="special">{}</span>
817
818     <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">)</span> <span class="special">{</span>
819
820 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
821         <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">(&amp;</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="identifier">run</span> <span class="identifier">time</span> <span class="identifier">check</span> <span class="keyword">throw</span> <span class="keyword">if</span> <span class="keyword">not</span> <span class="identifier">locks</span> <span class="identifier">the</span> <span class="identifier">same</span>
822 <span class="preprocessor">#endif</span>
823         <span class="keyword">return</span> <span class="identifier">obj_</span><span class="special">;</span>
824     <span class="special">}</span>
825     <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">&amp;</span> <span class="identifier">obj</span><span class="special">,</span> <span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">lockable</span><span class="special">)</span> <span class="special">{</span>
826         <span class="identifier">obj_</span> <span class="special">=</span> <span class="identifier">obj</span><span class="special">;</span>
827         <span class="identifier">lockable_</span><span class="special">=</span><span class="identifier">lockable</span><span class="special">;</span>
828     <span class="special">}</span>
829 <span class="keyword">private</span><span class="special">:</span>
830     <span class="identifier">T</span> <span class="identifier">obj_</span><span class="special">;</span>
831     <span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">lockable_</span><span class="special">;</span>
832 <span class="special">};</span>
833 </pre>
834 <p>
835             <code class="computeroutput"><span class="identifier">externally_locked</span></code> cloaks
836             an object of type T, and actually provides full access to that object
837             through the get and set member functions, provided you pass a reference
838             to a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">Owner</span><span class="special">&gt;</span></code>
839             object.
840           </p>
841 <p>
842             Instead of making <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>
843             and <code class="computeroutput"><span class="identifier">savingsAcct_</span></code> of type
844             <code class="computeroutput"><span class="identifier">BankAccount</span></code>, <code class="computeroutput"><span class="identifier">AccountManager</span></code> holds objects of type
845             <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">,</span>
846             <span class="identifier">AccountManager</span><span class="special">&gt;</span></code>:
847           </p>
848 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">AccountManager</span>
849     <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">thread_mutex</span><span class="special">&gt;</span>
850 <span class="special">{</span>
851 <span class="keyword">public</span><span class="special">:</span>
852     <span class="keyword">typedef</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">thread_mutex</span><span class="special">&gt;</span> <span class="identifier">lockable_base_type</span><span class="special">;</span>
853     <span class="identifier">AccountManager</span><span class="special">()</span>
854         <span class="special">:</span> <span class="identifier">checkingAcct_</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
855         <span class="special">,</span> <span class="identifier">savingsAcct_</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
856     <span class="special">{}</span>
857     <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>
858     <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>
859 <span class="keyword">private</span><span class="special">:</span>
860
861     <span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">,</span> <span class="identifier">AccountManager</span><span class="special">&gt;</span> <span class="identifier">checkingAcct_</span><span class="special">;</span>
862     <span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">,</span> <span class="identifier">AccountManager</span><span class="special">&gt;</span> <span class="identifier">savingsAcct_</span><span class="special">;</span>
863 <span class="special">};</span>
864 </pre>
865 <p>
866             The pattern is the same as before - to access the BankAccount object
867             cloaked by <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>,
868             you need to call <code class="computeroutput"><span class="identifier">get</span></code>.
869             To call <code class="computeroutput"><span class="identifier">get</span></code>, you need
870             to pass it a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">AccountManager</span><span class="special">&gt;</span></code>. The one thing you have to take care
871             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
872             you don't use them after the strict_lock has been destroyed. That is,
873             if you alias the cloaked objects, you're back from "the compiler
874             takes care of that" mode to "you must pay attention" mode.
875           </p>
876 <p>
877             Typically, you use <code class="computeroutput"><span class="identifier">externally_locked</span></code>
878             as shown below. Suppose you want to execute an atomic transfer from your
879             checking account to your savings account:
880           </p>
881 <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>
882     <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">AccountManager</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
883     <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>
884     <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>
885 <span class="special">}</span>
886 </pre>
887 <p>
888             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>
889             makes it clear to the code reader that that variable is protected by
890             a lock on an AccountManager. Second, the design makes it impossible to
891             manipulate the two accounts without actually locking a BankAccount.
892             <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
893             what could be called active documentation.
894           </p>
895 </div>
896 <div class="section">
897 <div class="titlepage"><div><div><h5 class="title">
898 <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
899           other strict locks</a>
900 </h5></div></div></div>
901 <p>
902             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
903             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>
904             is not a strict lock the following code doesn't compile:
905           </p>
906 <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>
907     <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">AccountManager</span><span class="special">&gt;</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>
908     <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
909         <span class="identifier">guard</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
910     <span class="special">}</span>
911     <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>
912     <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>
913     <span class="identifier">do_something_else</span><span class="special">();</span>
914 <span class="special">}</span>
915 </pre>
916 <p>
917             We need a way to transfer the ownership from the <code class="computeroutput"><span class="identifier">unique_lock</span></code>
918             to a <code class="computeroutput"><span class="identifier">strict_lock</span></code> during
919             the time we are working with <code class="computeroutput"><span class="identifier">savingsAcct_</span></code>
920             and then restore the ownership on <code class="computeroutput"><span class="identifier">unique_lock</span></code>.
921           </p>
922 <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>
923     <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">AccountManager</span><span class="special">&gt;</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>
924     <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
925         <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
926     <span class="special">}</span>
927     <span class="special">{</span>
928         <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">AccountManager</span><span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">guard1</span><span class="special">);</span>
929         <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>
930         <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>
931     <span class="special">}</span>
932     <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
933 <span class="special">}</span>
934 </pre>
935 <p>
936             In order to make this code compilable we need to store either a Lockable
937             or a <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span></code>
938             reference depending on the constructor. We also need to store which kind
939             of reference we have stored, and in the destructor call either to the
940             Lockable <code class="computeroutput"><span class="identifier">unlock</span></code> or restore
941             the ownership.
942           </p>
943 <p>
944             This seems too complicated to me. Another possibility is to define a
945             nested strict lock class. The drawback is that instead of having only
946             one strict lock we have two and we need either to duplicate every function
947             taking a <code class="computeroutput"><span class="identifier">strict_lock</span></code>
948             or make these function templates. The problem with template functions
949             is that we don't profit anymore of the C++ type system. We must add some
950             static metafunction that checks that the Locker parameter is a strict
951             lock. The problem is that we can not really check this or can we?. The
952             <code class="computeroutput"><span class="identifier">is_strict_lock</span></code> metafunction
953             must be specialized by the strict lock developer. We need to believe
954             it "sur parole". The advantage is that now we can manage with
955             more than two strict locks without changing our code. This is really
956             nice.
957           </p>
958 <p>
959             Now we need to state that both classes are <code class="computeroutput"><span class="identifier">strict_lock</span></code>s.
960           </p>
961 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Locker</span><span class="special">&gt;</span>
962 <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>
963
964 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
965 <span class="keyword">struct</span> <span class="identifier">is_strict_lock</span><span class="special">&lt;</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> <span class="special">{}</span>
966
967 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Locker</span><span class="special">&gt;</span>
968 <span class="keyword">struct</span> <span class="identifier">is_strict_lock</span><span class="special">&lt;</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Locker</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> <span class="special">{}</span>
969 </pre>
970 <p>
971             Well let me show what this <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>
972             class looks like and the impacts on the <code class="computeroutput"><span class="identifier">externally_locked</span></code>
973             class and the <code class="computeroutput"><span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedFunction</span></code>
974             function.
975           </p>
976 <p>
977             First <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>
978             class will store on a temporary lock the <code class="computeroutput"><span class="identifier">Locker</span></code>,
979             and transfer the lock ownership on the constructor. On destruction it
980             will restore the ownership. Note the use of <code class="computeroutput"><span class="identifier">lock_traits</span></code>
981             and that the <code class="computeroutput"><span class="identifier">Locker</span></code> needs
982             to have a reference to the mutex otherwise and exception is thrown.
983           </p>
984 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Locker</span> <span class="special">&gt;</span>
985 <span class="keyword">class</span> <span class="identifier">nested_strict_lock</span>
986     <span class="special">{</span>
987       <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">MovableLockerConcept</span><span class="special">&lt;</span><span class="identifier">Locker</span><span class="special">&gt;));</span>
988 <span class="keyword">public</span><span class="special">:</span>
989     <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">lockable_type</span><span class="special">&lt;</span><span class="identifier">Locker</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">lockable_type</span><span class="special">;</span>
990     <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">syntactic_lock_traits</span><span class="special">&lt;</span><span class="identifier">lockable_type</span><span class="special">&gt;::</span><span class="identifier">lock_error</span> <span class="identifier">lock_error</span><span class="special">;</span>
991
992     <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Locker</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">)</span>
993         <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>
994         <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 temporaty locker </span>
995     <span class="special">{</span>
996         <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
997         <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>
998             <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>
999             <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span>
1000         <span class="special">}</span>
1001         <span class="preprocessor">#endif</span>
1002         <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>
1003     <span class="special">}</span>
1004     <span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="special">{</span>
1005         <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>
1006     <span class="special">}</span>
1007     <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>
1008     <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>
1009     <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>
1010
1011
1012 <span class="keyword">private</span><span class="special">:</span>
1013     <span class="identifier">Locker</span><span class="special">&amp;</span> <span class="identifier">lock_</span><span class="special">;</span>
1014     <span class="identifier">Locker</span> <span class="identifier">tmp_lock_</span><span class="special">;</span>
1015 <span class="special">};</span>
1016 </pre>
1017 <p>
1018             The <code class="computeroutput"><span class="identifier">externally_locked</span></code>
1019             get function is now a template function taking a Locker as parameters
1020             instead of a <code class="computeroutput"><span class="identifier">strict_lock</span></code>.
1021             We can add test in debug mode that ensure that the Lockable object is
1022             locked.
1023           </p>
1024 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
1025 <span class="keyword">class</span> <span class="identifier">externally_locked</span> <span class="special">{</span>
1026 <span class="keyword">public</span><span class="special">:</span>
1027     <span class="comment">// ...</span>
1028     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Locker</span><span class="special">&gt;</span>
1029     <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Locker</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">)</span> <span class="special">{</span>
1030         <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">StrictLockerConcept</span><span class="special">&lt;</span><span class="identifier">Locker</span><span class="special">&gt;));</span>
1031
1032         <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_strict_lock</span><span class="special">&lt;</span><span class="identifier">Locker</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span> <span class="comment">// locker is a strict locker "sur parole" </span>
1033         <span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">,</span>
1034                 <span class="keyword">typename</span> <span class="identifier">lockable_type</span><span class="special">&lt;</span><span class="identifier">Locker</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span> <span class="comment">// that locks the same type </span>
1035 <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>
1036         <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>
1037 <span class="preprocessor">#endif</span>
1038 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
1039         <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">(&amp;</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>
1040 <span class="preprocessor">#endif</span>
1041         <span class="keyword">return</span> <span class="identifier">obj_</span><span class="special">;</span>
1042     <span class="special">}</span>
1043 <span class="special">};</span>
1044 </pre>
1045 <p>
1046             The <code class="computeroutput"><span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedFunction</span></code> function needs
1047             only to replace the <code class="computeroutput"><span class="identifier">strict_lock</span></code>
1048             by a <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>.
1049           </p>
1050 <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>
1051     <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">AccountManager</span><span class="special">&gt;</span> <span class="identifier">guard1</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
1052     <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
1053         <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
1054     <span class="special">}</span>
1055     <span class="special">{</span>
1056         <span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">AccountManager</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">guard</span><span class="special">(</span><span class="identifier">guard1</span><span class="special">);</span>
1057         <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>
1058         <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>
1059     <span class="special">}</span>
1060     <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
1061 <span class="special">}</span>
1062 </pre>
1063 </div>
1064 </div>
1065 <div class="section">
1066 <div class="titlepage"><div><div><h4 class="title">
1067 <a name="thread.synchronization.tutorial.with"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.with" title="Executing Around a Function">Executing Around
1068         a Function</a>
1069 </h4></div></div></div>
1070 <p>
1071           In particular, the library provides a way to lock around the execution
1072           of a function.
1073         </p>
1074 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
1075 <span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span>
1076     <span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span>
1077     <span class="identifier">Function</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">,</span>
1078     <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span>
1079 <span class="special">)</span> <span class="special">-&gt;</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">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...))</span> <span class="special">{</span>
1080   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span>
1081   <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">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...);</span>
1082 <span class="special">}</span>
1083 </pre>
1084 <p>
1085           that can be used with regular functions:
1086         </p>
1087 <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">&amp;);</span>
1088 <span class="comment">//...</span>
1089 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span>
1090 <span class="keyword">int</span> <span class="identifier">a</span><span class="special">;</span>
1091 <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>
1092 </pre>
1093 <p>
1094           with boost::bind:
1095         </p>
1096 <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>
1097     <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>
1098 <span class="special">);</span>
1099 </pre>
1100 <p>
1101           or with lambda expression:
1102         </p>
1103 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span><span class="special">;</span>
1104 <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>
1105     <span class="identifier">m</span><span class="special">,</span>
1106     <span class="special">[&amp;</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>
1107       <span class="comment">// this scope is protected by mutex m</span>
1108       <span class="identifier">a</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
1109       <span class="keyword">return</span> <span class="identifier">x</span> <span class="special">+</span> <span class="number">4</span><span class="special">;</span>
1110     <span class="special">},</span>
1111     <span class="number">5</span>
1112 <span class="special">);</span>
1113 </pre>
1114 </div>
1115 </div>
1116 <div class="section">
1117 <div class="titlepage"><div><div><h3 class="title">
1118 <a name="thread.synchronization.mutex_concepts"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts" title="Mutex Concepts">Mutex Concepts</a>
1119 </h3></div></div></div>
1120 <div class="toc"><dl class="toc">
1121 <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>
1122 <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>
1123 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive">Recursive
1124         Lockable Concept</a></span></dt>
1125 <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>
1126 <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>
1127 <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>
1128 </dl></div>
1129 <p>
1130         A mutex object facilitates protection against data races and allows thread-safe
1131         synchronization of data between threads. A thread obtains ownership of a
1132         mutex object by calling one of the lock functions and relinquishes ownership
1133         by calling the corresponding unlock function. Mutexes may be either recursive
1134         or non-recursive, and may grant simultaneous ownership to one or many threads.
1135         <span class="bold"><strong>Boost.Thread</strong></span> supplies recursive and non-recursive
1136         mutexes with exclusive ownership semantics, along with a shared ownership
1137         (multiple-reader / single-writer) mutex.
1138       </p>
1139 <p>
1140         <span class="bold"><strong>Boost.Thread</strong></span> supports four basic concepts
1141         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
1142         implements one or more of these concepts, as do the various lock types.
1143       </p>
1144 <div class="section">
1145 <div class="titlepage"><div><div><h4 class="title">
1146 <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>
1147 </h4></div></div></div>
1148 <div class="toc"><dl class="toc">
1149 <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>
1150 <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>
1151 <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>
1152 </dl></div>
1153 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
1154
1155 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1156 <span class="special">{</span>
1157
1158   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1159   <span class="keyword">class</span> <span class="identifier">BasicLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1160 <span class="special">}</span>
1161 </pre>
1162 <p>
1163           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
1164           ownership. A type <code class="computeroutput"><span class="identifier">L</span></code> meets
1165           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
1166           the following expressions are well-formed and have the specified semantics
1167           (<code class="computeroutput"><span class="identifier">m</span></code> denotes a value of type
1168           <code class="computeroutput"><span class="identifier">L</span></code>):
1169         </p>
1170 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1171 <li class="listitem">
1172               <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>
1173             </li>
1174 <li class="listitem">
1175               <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>
1176             </li>
1177 </ul></div>
1178 <p>
1179           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>
1180           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>.
1181         </p>
1182 <div class="section">
1183 <div class="titlepage"><div><div><h5 class="title">
1184 <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>
1185 </h5></div></div></div>
1186 <div class="variablelist">
1187 <p class="title"><b></b></p>
1188 <dl class="variablelist">
1189 <dt><span class="term">Requires:</span></dt>
1190 <dd><p>
1191                   The calling thread doesn't owns the mutex if the mutex is not recursive.
1192                 </p></dd>
1193 <dt><span class="term">Effects:</span></dt>
1194 <dd><p>
1195                   The current thread blocks until ownership can be obtained for the
1196                   current thread.
1197                 </p></dd>
1198 <dt><span class="term">Synchronization:</span></dt>
1199 <dd><p>
1200                   Prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>
1201                   operations on the same object synchronizes with this operation.
1202                 </p></dd>
1203 <dt><span class="term">Postcondition:</span></dt>
1204 <dd><p>
1205                   The current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1206                 </p></dd>
1207 <dt><span class="term">Return type:</span></dt>
1208 <dd><p>
1209                   <code class="computeroutput"><span class="keyword">void</span></code>.
1210                 </p></dd>
1211 <dt><span class="term">Throws:</span></dt>
1212 <dd><p>
1213                   <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1214                   error occurs.
1215                 </p></dd>
1216 <dt><span class="term">Error Conditions:</span></dt>
1217 <dd>
1218 <p>
1219                   <span class="bold"><strong>operation_not_permitted</strong></span>: if the
1220                   thread does not have the privilege to perform the operation.
1221                 </p>
1222 <p>
1223                   <span class="bold"><strong>resource_deadlock_would_occur</strong></span>:
1224                   if the implementation detects that a deadlock would occur.
1225                 </p>
1226 <p>
1227                   <span class="bold"><strong>device_or_resource_busy</strong></span>: if the
1228                   mutex is already locked and blocking is not possible.
1229                 </p>
1230 </dd>
1231 <dt><span class="term">Thread safety:</span></dt>
1232 <dd><p>
1233                   If an exception is thrown then a lock shall not have been acquired
1234                   for the current thread.
1235                 </p></dd>
1236 </dl>
1237 </div>
1238 </div>
1239 <div class="section">
1240 <div class="titlepage"><div><div><h5 class="title">
1241 <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>
1242 </h5></div></div></div>
1243 <div class="variablelist">
1244 <p class="title"><b></b></p>
1245 <dl class="variablelist">
1246 <dt><span class="term">Requires:</span></dt>
1247 <dd><p>
1248                   The current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1249                 </p></dd>
1250 <dt><span class="term">Synchronization:</span></dt>
1251 <dd><p>
1252                   This operation synchronizes with subsequent lock operations that
1253                   obtain ownership on the same object.
1254                 </p></dd>
1255 <dt><span class="term">Effects:</span></dt>
1256 <dd><p>
1257                   Releases a lock on <code class="computeroutput"><span class="identifier">m</span></code>
1258                   by the current thread.
1259                 </p></dd>
1260 <dt><span class="term">Return type:</span></dt>
1261 <dd><p>
1262                   <code class="computeroutput"><span class="keyword">void</span></code>.
1263                 </p></dd>
1264 <dt><span class="term">Throws:</span></dt>
1265 <dd><p>
1266                   Nothing.
1267                 </p></dd>
1268 </dl>
1269 </div>
1270 </div>
1271 <div class="section">
1272 <div class="titlepage"><div><div><h5 class="title">
1273 <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>
1274 </h5></div></div></div>
1275 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1276
1277 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1278 <span class="special">{</span>
1279   <span class="keyword">namespace</span> <span class="identifier">sync</span>
1280   <span class="special">{</span>
1281     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1282     <span class="keyword">class</span> <span class="identifier">is_basic_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1283   <span class="special">}</span>
1284 <span class="special">}</span>
1285 </pre>
1286 <p>
1287             Some of the algorithms on mutexes use this trait via SFINAE.
1288           </p>
1289 <p>
1290             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.
1291           </p>
1292 <div class="warning"><table border="0" summary="Warning">
1293 <tr>
1294 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1295 <th align="left">Warning</th>
1296 </tr>
1297 <tr><td align="left" valign="top"><p>
1298               If BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES is defined you will need
1299               to specialize this traits for the models of BasicLockable you could
1300               build.
1301             </p></td></tr>
1302 </table></div>
1303 </div>
1304 </div>
1305 <div class="section">
1306 <div class="titlepage"><div><div><h4 class="title">
1307 <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>
1308 </h4></div></div></div>
1309 <div class="toc"><dl class="toc">
1310 <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>
1311 <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>
1312 </dl></div>
1313 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
1314 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1315 <span class="special">{</span>
1316   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1317   <span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">;</span>
1318 <span class="special">}</span>
1319 </pre>
1320 <p>
1321           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
1322           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
1323           the following expressions are well-formed and have the specified semantics
1324           (<code class="computeroutput"><span class="identifier">m</span></code> denotes a value of type
1325           <code class="computeroutput"><span class="identifier">L</span></code>):
1326         </p>
1327 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1328               <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>
1329             </li></ul></div>
1330 <p>
1331           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>
1332           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>.
1333         </p>
1334 <div class="section">
1335 <div class="titlepage"><div><div><h5 class="title">
1336 <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>
1337 </h5></div></div></div>
1338 <div class="variablelist">
1339 <p class="title"><b></b></p>
1340 <dl class="variablelist">
1341 <dt><span class="term">Requires:</span></dt>
1342 <dd><p>
1343                   The calling thread doesn't owns the mutex if the mutex is not recursive.
1344                 </p></dd>
1345 <dt><span class="term">Effects:</span></dt>
1346 <dd><p>
1347                   Attempt to obtain ownership for the current thread without blocking.
1348                 </p></dd>
1349 <dt><span class="term">Synchronization:</span></dt>
1350 <dd><p>
1351                   If <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>
1352                   returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> operations on the same object
1353                   synchronize with this operation.
1354                 </p></dd>
1355 <dt><span class="term">Note:</span></dt>
1356 <dd><p>
1357                   Since <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>
1358                   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
1359                   enough that little would be known about the state after a failure,
1360                   even in the absence of spurious failures.
1361                 </p></dd>
1362 <dt><span class="term">Return type:</span></dt>
1363 <dd><p>
1364                   <code class="computeroutput"><span class="keyword">bool</span></code>.
1365                 </p></dd>
1366 <dt><span class="term">Returns:</span></dt>
1367 <dd><p>
1368                   <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1369                   was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1370                   otherwise.
1371                 </p></dd>
1372 <dt><span class="term">Postcondition:</span></dt>
1373 <dd><p>
1374                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1375                   the current thread owns the <code class="computeroutput"><span class="identifier">m</span></code>.
1376                 </p></dd>
1377 <dt><span class="term">Throws:</span></dt>
1378 <dd><p>
1379                   Nothing.
1380                 </p></dd>
1381 </dl>
1382 </div>
1383 </div>
1384 <div class="section">
1385 <div class="titlepage"><div><div><h5 class="title">
1386 <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>
1387 </h5></div></div></div>
1388 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1389 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1390 <span class="special">{</span>
1391   <span class="keyword">namespace</span> <span class="identifier">sync</span>
1392   <span class="special">{</span>
1393     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1394     <span class="keyword">class</span> <span class="identifier">is_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1395   <span class="special">}</span>
1396 <span class="special">}</span>
1397 </pre>
1398 <p>
1399             Some of the algorithms on mutexes use this trait via SFINAE.
1400           </p>
1401 <p>
1402             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.
1403           </p>
1404 <div class="warning"><table border="0" summary="Warning">
1405 <tr>
1406 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1407 <th align="left">Warning</th>
1408 </tr>
1409 <tr><td align="left" valign="top"><p>
1410               If BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES is defined you will need
1411               to specialize this traits for the models of Lockable you could build.
1412             </p></td></tr>
1413 </table></div>
1414 </div>
1415 </div>
1416 <div class="section">
1417 <div class="titlepage"><div><div><h4 class="title">
1418 <a name="thread.synchronization.mutex_concepts.recursive"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive" title="Recursive Lockable Concept">Recursive
1419         Lockable Concept</a>
1420 </h4></div></div></div>
1421 <div class="toc"><dl class="toc">
1422 <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 --
1423           EXTENSION</a></span></dt>
1424 <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 --
1425           EXTENSION</a></span></dt>
1426 <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>
1427 </dl></div>
1428 <p>
1429           The user could require that the mutex passed to an algorithm is a recursive
1430           one. Whether a lockable is recursive or not can not be checked using template
1431           meta-programming. This is the motivation for the following trait.
1432         </p>
1433 <div class="section">
1434 <div class="titlepage"><div><div><h5 class="title">
1435 <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 --
1436           EXTENSION</a>
1437 </h5></div></div></div>
1438 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1439
1440 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1441 <span class="special">{</span>
1442   <span class="keyword">namespace</span> <span class="identifier">sync</span>
1443   <span class="special">{</span>
1444     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1445     <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>
1446     <span class="keyword">template</span><span class="special">&lt;&gt;</span>
1447     <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special">&lt;</span><span class="identifier">recursive_mutex</span><span class="special">&gt;:</span> <span class="identifier">true_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1448     <span class="keyword">template</span><span class="special">&lt;&gt;</span>
1449     <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special">&lt;</span><span class="identifier">timed_recursive_mutex</span><span class="special">&gt;:</span> <span class="identifier">true_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1450   <span class="special">}</span>
1451 <span class="special">}</span>
1452 </pre>
1453 <p>
1454             The trait <code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code>
1455             is <code class="computeroutput"><span class="identifier">false_type</span></code> by default
1456             and is specialized for the provide <code class="computeroutput"><span class="identifier">recursive_mutex</span></code>
1457             and <code class="computeroutput"><span class="identifier">timed_recursive_mutex</span></code>.
1458           </p>
1459 <p>
1460             It should be specialized by the user providing other model of recursive
1461             lockable.
1462           </p>
1463 </div>
1464 <div class="section">
1465 <div class="titlepage"><div><div><h5 class="title">
1466 <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 --
1467           EXTENSION</a>
1468 </h5></div></div></div>
1469 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1470 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1471 <span class="special">{</span>
1472   <span class="keyword">namespace</span> <span class="identifier">sync</span>
1473   <span class="special">{</span>
1474     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1475     <span class="keyword">class</span> <span class="identifier">is_recursive_basic_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1476   <span class="special">}</span>
1477 <span class="special">}</span>
1478 </pre>
1479 <p>
1480             This traits is true_type if is_basic_lockable and is_recursive_mutex_sur_parole.
1481           </p>
1482 </div>
1483 <div class="section">
1484 <div class="titlepage"><div><div><h5 class="title">
1485 <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>
1486 </h5></div></div></div>
1487 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1488 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1489 <span class="special">{</span>
1490   <span class="keyword">namespace</span> <span class="identifier">sync</span>
1491   <span class="special">{</span>
1492     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1493     <span class="keyword">class</span> <span class="identifier">is_recursive_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1494   <span class="special">}</span>
1495 <span class="special">}</span>
1496 </pre>
1497 <p>
1498             This traits is true_type if is_lockable and is_recursive_mutex_sur_parole.
1499           </p>
1500 </div>
1501 </div>
1502 <div class="section">
1503 <div class="titlepage"><div><div><h4 class="title">
1504 <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>
1505 </h4></div></div></div>
1506 <div class="toc"><dl class="toc">
1507 <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>
1508 <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>
1509 <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>
1510 <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>
1511 </dl></div>
1512 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
1513
1514 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1515 <span class="special">{</span>
1516   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1517   <span class="keyword">class</span> <span class="identifier">TimedLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1518 <span class="special">}</span>
1519 </pre>
1520 <p>
1521           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
1522           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
1523           for timeouts when trying to acquire the lock.
1524         </p>
1525 <p>
1526           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
1527           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
1528           following expressions are well-formed and have the specified semantics.
1529         </p>
1530 <p>
1531           <span class="bold"><strong>Variables:</strong></span>
1532         </p>
1533 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1534 <li class="listitem">
1535               <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
1536               type <code class="computeroutput"><span class="identifier">L</span></code>,
1537             </li>
1538 <li class="listitem">
1539               <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1540               value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
1541               and
1542             </li>
1543 <li class="listitem">
1544               <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1545               value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
1546             </li>
1547 </ul></div>
1548 <p>
1549           <span class="bold"><strong>Expressions:</strong></span>
1550         </p>
1551 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1552 <li class="listitem">
1553               <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>
1554             </li>
1555 <li class="listitem">
1556               <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>
1557             </li>
1558 </ul></div>
1559 <p>
1560           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
1561           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>.
1562         </p>
1563 <div class="section">
1564 <div class="titlepage"><div><div><h5 class="title">
1565 <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>
1566 </h5></div></div></div>
1567 <div class="variablelist">
1568 <p class="title"><b></b></p>
1569 <dl class="variablelist">
1570 <dt><span class="term">Requires:</span></dt>
1571 <dd><p>
1572                   The calling thread doesn't owns the mutex if the mutex is not recursive.
1573                 </p></dd>
1574 <dt><span class="term">Effects:</span></dt>
1575 <dd><p>
1576                   Attempt to obtain ownership for the current thread. Blocks until
1577                   ownership can be obtained, or the specified time is reached. If
1578                   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>.
1579                 </p></dd>
1580 <dt><span class="term">Synchronization:</span></dt>
1581 <dd><p>
1582                   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>
1583                   operations on the same object synchronize with this operation.
1584                 </p></dd>
1585 <dt><span class="term">Return type:</span></dt>
1586 <dd><p>
1587                   <code class="computeroutput"><span class="keyword">bool</span></code>.
1588                 </p></dd>
1589 <dt><span class="term">Returns:</span></dt>
1590 <dd><p>
1591                   <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1592                   was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1593                   otherwise.
1594                 </p></dd>
1595 <dt><span class="term">Postcondition:</span></dt>
1596 <dd><p>
1597                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1598                   the current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1599                 </p></dd>
1600 <dt><span class="term">Throws:</span></dt>
1601 <dd><p>
1602                   Nothing.
1603                 </p></dd>
1604 </dl>
1605 </div>
1606 </div>
1607 <div class="section">
1608 <div class="titlepage"><div><div><h5 class="title">
1609 <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>
1610 </h5></div></div></div>
1611 <div class="variablelist">
1612 <p class="title"><b></b></p>
1613 <dl class="variablelist">
1614 <dt><span class="term">Requires:</span></dt>
1615 <dd><p>
1616                   The calling thread doesn't owns the mutex if the mutex is not recursive.
1617                 </p></dd>
1618 <dt><span class="term">Effects:</span></dt>
1619 <dd><p>
1620                   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>.
1621                 </p></dd>
1622 <dt><span class="term">Synchronization:</span></dt>
1623 <dd><p>
1624                   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>
1625                   operations on the same object synchronize with this operation.
1626                 </p></dd>
1627 </dl>
1628 </div>
1629 </div>
1630 <div class="warning"><table border="0" summary="Warning">
1631 <tr>
1632 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1633 <th align="left">Warning</th>
1634 </tr>
1635 <tr><td align="left" valign="top">
1636 <p>
1637             DEPRECATED since 4.00. The following expressions were required on version
1638             2, but are now deprecated.
1639           </p>
1640 <p>
1641             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>.
1642           </p>
1643 </td></tr>
1644 </table></div>
1645 <p>
1646           <span class="bold"><strong>Variables:</strong></span>
1647         </p>
1648 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1649 <li class="listitem">
1650               <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1651               value of an instantiation of an unspecified <code class="computeroutput"><span class="identifier">DurationType</span></code>
1652               arithmetic compatible with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>,
1653               and
1654             </li>
1655 <li class="listitem">
1656               <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1657               value of an instantiation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>:
1658             </li>
1659 </ul></div>
1660 <p>
1661           <span class="bold"><strong>Expressions:</strong></span>
1662         </p>
1663 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1664 <li class="listitem">
1665               <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>
1666             </li>
1667 <li class="listitem">
1668               <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>
1669             </li>
1670 </ul></div>
1671 <p>
1672           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>
1673           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>.
1674         </p>
1675 <div class="section">
1676 <div class="titlepage"><div><div><h5 class="title">
1677 <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>
1678 </h5></div></div></div>
1679 <div class="variablelist">
1680 <p class="title"><b></b></p>
1681 <dl class="variablelist">
1682 <dt><span class="term">Effects:</span></dt>
1683 <dd><p>
1684                   Attempt to obtain ownership for the current thread. Blocks until
1685                   ownership can be obtained, or the specified time is reached. If
1686                   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>.
1687                 </p></dd>
1688 <dt><span class="term">Returns:</span></dt>
1689 <dd><p>
1690                   <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1691                   was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1692                   otherwise.
1693                 </p></dd>
1694 <dt><span class="term">Postcondition:</span></dt>
1695 <dd><p>
1696                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1697                   the current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1698                 </p></dd>
1699 <dt><span class="term">Throws:</span></dt>
1700 <dd><p>
1701                   <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1702                   error occurs.
1703                 </p></dd>
1704 </dl>
1705 </div>
1706 </div>
1707 <div class="section">
1708 <div class="titlepage"><div><div><h5 class="title">
1709 <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>
1710 </h5></div></div></div>
1711 <div class="variablelist">
1712 <p class="title"><b></b></p>
1713 <dl class="variablelist">
1714 <dt><span class="term">Effects:</span></dt>
1715 <dd><p>
1716                   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>.
1717                 </p></dd>
1718 </dl>
1719 </div>
1720 </div>
1721 </div>
1722 <div class="section">
1723 <div class="titlepage"><div><div><h4 class="title">
1724 <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>
1725 </h4></div></div></div>
1726 <div class="toc"><dl class="toc">
1727 <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>
1728 <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>
1729 <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>
1730 <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>
1731 <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>
1732 <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>
1733 </dl></div>
1734 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
1735
1736 <span class="keyword">namespace</span> <span class="identifier">boost</span>
1737 <span class="special">{</span>
1738   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1739   <span class="keyword">class</span> <span class="identifier">SharedLockable</span><span class="special">;</span>  <span class="comment">// C++14</span>
1740 <span class="special">}</span>
1741 </pre>
1742 <p>
1743           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
1744           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
1745           for <span class="emphasis"><em>shared ownership</em></span> as well as <span class="emphasis"><em>exclusive
1746           ownership</em></span>. This is the standard multiple-reader / single-write
1747           model: at most one thread can have exclusive ownership, and if any thread
1748           does have exclusive ownership, no other threads can have shared or exclusive
1749           ownership. Alternatively, many threads may have shared ownership.
1750         </p>
1751 <p>
1752           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
1753           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
1754           the following expressions are well-formed and have the specified semantics.
1755         </p>
1756 <p>
1757           <span class="bold"><strong>Variables:</strong></span>
1758         </p>
1759 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1760 <li class="listitem">
1761               <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
1762               type <code class="computeroutput"><span class="identifier">L</span></code>,
1763             </li>
1764 <li class="listitem">
1765               <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1766               value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
1767               and
1768             </li>
1769 <li class="listitem">
1770               <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1771               value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
1772             </li>
1773 </ul></div>
1774 <p>
1775           <span class="bold"><strong>Expressions:</strong></span>
1776         </p>
1777 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1778 <li class="listitem">
1779               <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>
1780             </li>
1781 <li class="listitem">
1782               <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>
1783             </li>
1784 <li class="listitem">
1785               <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>
1786             </li>
1787 <li class="listitem">
1788               <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>
1789             </li>
1790 <li class="listitem">
1791               <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>
1792             </li>
1793 </ul></div>
1794 <p>
1795           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>,
1796           <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>,
1797           <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
1798           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>.
1799         </p>
1800 <div class="section">
1801 <div class="titlepage"><div><div><h5 class="title">
1802 <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>
1803 </h5></div></div></div>
1804 <div class="variablelist">
1805 <p class="title"><b></b></p>
1806 <dl class="variablelist">
1807 <dt><span class="term">Effects:</span></dt>
1808 <dd><p>
1809                   The current thread blocks until shared ownership can be obtained
1810                   for the current thread.
1811                 </p></dd>
1812 <dt><span class="term">Postcondition:</span></dt>
1813 <dd><p>
1814                   The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1815                 </p></dd>
1816 <dt><span class="term">Throws:</span></dt>
1817 <dd><p>
1818                   <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1819                   error occurs.
1820                 </p></dd>
1821 </dl>
1822 </div>
1823 </div>
1824 <div class="section">
1825 <div class="titlepage"><div><div><h5 class="title">
1826 <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>
1827 </h5></div></div></div>
1828 <div class="variablelist">
1829 <p class="title"><b></b></p>
1830 <dl class="variablelist">
1831 <dt><span class="term">Effects:</span></dt>
1832 <dd><p>
1833                   Attempt to obtain shared ownership for the current thread without
1834                   blocking.
1835                 </p></dd>
1836 <dt><span class="term">Returns:</span></dt>
1837 <dd><p>
1838                   <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1839                   was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1840                   otherwise.
1841                 </p></dd>
1842 <dt><span class="term">Postcondition:</span></dt>
1843 <dd><p>
1844                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1845                   the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1846                 </p></dd>
1847 <dt><span class="term">Throws:</span></dt>
1848 <dd><p>
1849                   <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1850                   error occurs.
1851                 </p></dd>
1852 </dl>
1853 </div>
1854 </div>
1855 <div class="section">
1856 <div class="titlepage"><div><div><h5 class="title">
1857 <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>
1858 </h5></div></div></div>
1859 <div class="variablelist">
1860 <p class="title"><b></b></p>
1861 <dl class="variablelist">
1862 <dt><span class="term">Effects:</span></dt>
1863 <dd><p>
1864                   Attempt to obtain shared ownership for the current thread. Blocks
1865                   until shared ownership can be obtained, or the specified duration
1866                   is elapsed. If the specified duration is already elapsed, behaves
1867                   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>.
1868                 </p></dd>
1869 <dt><span class="term">Returns:</span></dt>
1870 <dd><p>
1871                   <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1872                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1873                   otherwise.
1874                 </p></dd>
1875 <dt><span class="term">Postcondition:</span></dt>
1876 <dd><p>
1877                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1878                   the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1879                 </p></dd>
1880 <dt><span class="term">Throws:</span></dt>
1881 <dd><p>
1882                   <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1883                   error occurs.
1884                 </p></dd>
1885 </dl>
1886 </div>
1887 </div>
1888 <div class="section">
1889 <div class="titlepage"><div><div><h5 class="title">
1890 <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>
1891 </h5></div></div></div>
1892 <div class="variablelist">
1893 <p class="title"><b></b></p>
1894 <dl class="variablelist">
1895 <dt><span class="term">Effects:</span></dt>
1896 <dd><p>
1897                   Attempt to obtain shared ownership for the current thread. Blocks
1898                   until shared ownership can be obtained, or the specified time is
1899                   reached. If the specified time has already passed, behaves as
1900                   <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>.
1901                 </p></dd>
1902 <dt><span class="term">Returns:</span></dt>
1903 <dd><p>
1904                   <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1905                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1906                   otherwise.
1907                 </p></dd>
1908 <dt><span class="term">Postcondition:</span></dt>
1909 <dd><p>
1910                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1911                   the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1912                 </p></dd>
1913 <dt><span class="term">Throws:</span></dt>
1914 <dd><p>
1915                   <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1916                   error occurs.
1917                 </p></dd>
1918 </dl>
1919 </div>
1920 </div>
1921 <div class="section">
1922 <div class="titlepage"><div><div><h5 class="title">
1923 <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>
1924 </h5></div></div></div>
1925 <div class="variablelist">
1926 <p class="title"><b></b></p>
1927 <dl class="variablelist">
1928 <dt><span class="term">Precondition:</span></dt>
1929 <dd><p>
1930                   The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1931                 </p></dd>
1932 <dt><span class="term">Effects:</span></dt>
1933 <dd><p>
1934                   Releases shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>
1935                   by the current thread.
1936                 </p></dd>
1937 <dt><span class="term">Postcondition:</span></dt>
1938 <dd><p>
1939                   The current thread no longer has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1940                 </p></dd>
1941 <dt><span class="term">Throws:</span></dt>
1942 <dd><p>
1943                   Nothing
1944                 </p></dd>
1945 </dl>
1946 </div>
1947 </div>
1948 <div class="warning"><table border="0" summary="Warning">
1949 <tr>
1950 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1951 <th align="left">Warning</th>
1952 </tr>
1953 <tr><td align="left" valign="top">
1954 <p>
1955             DEPRECATED since 3.00. The following expressions were required on version
1956             2, but are now deprecated.
1957           </p>
1958 <p>
1959             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>.
1960           </p>
1961 </td></tr>
1962 </table></div>
1963 <p>
1964           <span class="bold"><strong>Variables:</strong></span>
1965         </p>
1966 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1967               <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1968               value of an instantiation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>:
1969             </li></ul></div>
1970 <p>
1971           <span class="bold"><strong>Expressions:</strong></span>
1972         </p>
1973 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1974               <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>
1975             </li></ul></div>
1976 <p>
1977           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>
1978           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>.
1979         </p>
1980 <div class="section">
1981 <div class="titlepage"><div><div><h5 class="title">
1982 <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>
1983 </h5></div></div></div>
1984 <div class="variablelist">
1985 <p class="title"><b></b></p>
1986 <dl class="variablelist">
1987 <dt><span class="term">Effects:</span></dt>
1988 <dd><p>
1989                   Attempt to obtain shared ownership for the current thread. Blocks
1990                   until shared ownership can be obtained, or the specified time is
1991                   reached. If the specified time has already passed, behaves as
1992                   <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>.
1993                 </p></dd>
1994 <dt><span class="term">Returns:</span></dt>
1995 <dd><p>
1996                   <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1997                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1998                   otherwise.
1999                 </p></dd>
2000 <dt><span class="term">Postcondition:</span></dt>
2001 <dd><p>
2002                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2003                   the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2004                 </p></dd>
2005 <dt><span class="term">Throws:</span></dt>
2006 <dd><p>
2007                   <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
2008                   error occurs.
2009                 </p></dd>
2010 </dl>
2011 </div>
2012 </div>
2013 </div>
2014 <div class="section">
2015 <div class="titlepage"><div><div><h4 class="title">
2016 <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>
2017 </h4></div></div></div>
2018 <div class="toc"><dl class="toc">
2019 <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>
2020 <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>
2021 <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>
2022 <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>
2023 <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>
2024 <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>
2025 <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>
2026 <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>
2027 <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>
2028 <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>
2029 <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>
2030 <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>
2031 <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>
2032 <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>
2033 <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>
2034 <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>
2035 <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>
2036 <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>
2037 </dl></div>
2038 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
2039
2040 <span class="keyword">namespace</span> <span class="identifier">boost</span>
2041 <span class="special">{</span>
2042   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
2043   <span class="keyword">class</span> <span class="identifier">UpgradeLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
2044 <span class="special">}</span>
2045 </pre>
2046 <p>
2047           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
2048           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
2049           for <span class="emphasis"><em>upgradable ownership</em></span> as well as <span class="emphasis"><em>shared
2050           ownership</em></span> and <span class="emphasis"><em>exclusive ownership</em></span>. This
2051           is an extension to the multiple-reader / single-write model provided by
2052           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
2053           thread may have <span class="emphasis"><em>upgradable ownership</em></span> at the same time
2054           as others have <span class="emphasis"><em>shared ownership</em></span>. The thread with
2055           <span class="emphasis"><em>upgradable ownership</em></span> may at any time attempt to upgrade
2056           that ownership to <span class="emphasis"><em>exclusive ownership</em></span>. If no other
2057           threads have shared ownership, the upgrade is completed immediately, and
2058           the thread now has <span class="emphasis"><em>exclusive ownership</em></span>, which must
2059           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>,
2060           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>.
2061         </p>
2062 <p>
2063           If a thread with <span class="emphasis"><em>upgradable ownership</em></span> tries to upgrade
2064           whilst other threads have <span class="emphasis"><em>shared ownership</em></span>, the attempt
2065           will fail and the thread will block until <span class="emphasis"><em>exclusive ownership</em></span>
2066           can be acquired.
2067         </p>
2068 <p>
2069           Ownership can also be <span class="emphasis"><em>downgraded</em></span> as well as <span class="emphasis"><em>upgraded</em></span>:
2070           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
2071           downgraded to upgradable ownership or shared ownership, and upgradable
2072           ownership can be downgraded to plain shared ownership.
2073         </p>
2074 <p>
2075           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
2076           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
2077           the following expressions are well-formed and have the specified semantics.
2078         </p>
2079 <p>
2080           <span class="bold"><strong>Variables:</strong></span>
2081         </p>
2082 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2083 <li class="listitem">
2084               <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
2085               type <code class="computeroutput"><span class="identifier">L</span></code>,
2086             </li>
2087 <li class="listitem">
2088               <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
2089               value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
2090               and
2091             </li>
2092 <li class="listitem">
2093               <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
2094               value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
2095             </li>
2096 </ul></div>
2097 <p>
2098           <span class="bold"><strong>Expressions:</strong></span>
2099         </p>
2100 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2101 <li class="listitem">
2102               <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>
2103             </li>
2104 <li class="listitem">
2105               <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>
2106             </li>
2107 <li class="listitem">
2108               <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>
2109             </li>
2110 <li class="listitem">
2111               <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>
2112             </li>
2113 <li class="listitem">
2114               <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>
2115             </li>
2116 <li class="listitem">
2117               <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>
2118             </li>
2119 <li class="listitem">
2120               <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>
2121             </li>
2122 <li class="listitem">
2123               <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>
2124             </li>
2125 <li class="listitem">
2126               <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>
2127             </li>
2128 <li class="listitem">
2129               <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>
2130             </li>
2131 <li class="listitem">
2132               <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>
2133             </li>
2134 <li class="listitem">
2135               <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>
2136             </li>
2137 </ul></div>
2138 <p>
2139           If `BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION is defined the
2140           following expressions are also required:
2141         </p>
2142 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2143 <li class="listitem">
2144               <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>
2145             </li>
2146 <li class="listitem">
2147               <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>
2148             </li>
2149 <li class="listitem">
2150               <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>
2151             </li>
2152 <li class="listitem">
2153               <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>
2154             </li>
2155 <li class="listitem">
2156               <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>
2157             </li>
2158 <li class="listitem">
2159               <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>
2160             </li>
2161 </ul></div>
2162 <p>
2163           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>
2164           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>.
2165           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>
2166           functions, ownership must be released through a call to the unlock function
2167           corresponding to the new level of ownership.
2168         </p>
2169 <div class="section">
2170 <div class="titlepage"><div><div><h5 class="title">
2171 <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>
2172 </h5></div></div></div>
2173 <div class="variablelist">
2174 <p class="title"><b></b></p>
2175 <dl class="variablelist">
2176 <dt><span class="term">Precondition:</span></dt>
2177 <dd><p>
2178                   The calling thread has no ownership of the mutex.
2179                 </p></dd>
2180 <dt><span class="term">Effects:</span></dt>
2181 <dd><p>
2182                   The current thread blocks until upgrade ownership can be obtained
2183                   for the current thread.
2184                 </p></dd>
2185 <dt><span class="term">Postcondition:</span></dt>
2186 <dd><p>
2187                   The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2188                 </p></dd>
2189 <dt><span class="term">Synchronization:</span></dt>
2190 <dd><p>
2191                   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
2192                   synchronize with this operation.
2193                 </p></dd>
2194 <dt><span class="term">Throws:</span></dt>
2195 <dd><p>
2196                   <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
2197                   error occurs.
2198                 </p></dd>
2199 </dl>
2200 </div>
2201 </div>
2202 <div class="section">
2203 <div class="titlepage"><div><div><h5 class="title">
2204 <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>
2205 </h5></div></div></div>
2206 <div class="variablelist">
2207 <p class="title"><b></b></p>
2208 <dl class="variablelist">
2209 <dt><span class="term">Precondition:</span></dt>
2210 <dd><p>
2211                   The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2212                 </p></dd>
2213 <dt><span class="term">Effects:</span></dt>
2214 <dd><p>
2215                   Releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2216                   by the current thread.
2217                 </p></dd>
2218 <dt><span class="term">Postcondition:</span></dt>
2219 <dd><p>
2220                   The current thread no longer has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2221                 </p></dd>
2222 <dt><span class="term">Synchronization:</span></dt>
2223 <dd><p>
2224                   This operation synchronizes with subsequent lock operations that
2225                   obtain ownership on the same object.
2226                 </p></dd>
2227 <dt><span class="term">Throws:</span></dt>
2228 <dd><p>
2229                   Nothing
2230                 </p></dd>
2231 </dl>
2232 </div>
2233 </div>
2234 <div class="section">
2235 <div class="titlepage"><div><div><h5 class="title">
2236 <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>
2237 </h5></div></div></div>
2238 <div class="variablelist">
2239 <p class="title"><b></b></p>
2240 <dl class="variablelist">
2241 <dt><span class="term">Precondition:</span></dt>
2242 <dd><p>
2243                   The calling thread has no ownership of the mutex.
2244                 </p></dd>
2245 <dt><span class="term">Effects:</span></dt>
2246 <dd><p>
2247                   Attempts to obtain upgrade ownership of the mutex for the calling
2248                   thread without blocking. If upgrade ownership is not obtained,
2249                   there is no effect and try_lock_upgrade() immediately returns.
2250                 </p></dd>
2251 <dt><span class="term">Returns:</span></dt>
2252 <dd><p>
2253                   <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2254                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2255                   otherwise.
2256                 </p></dd>
2257 <dt><span class="term">Postcondition:</span></dt>
2258 <dd><p>
2259                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2260                   the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2261                 </p></dd>
2262 <dt><span class="term">Synchronization:</span></dt>
2263 <dd><p>
2264                   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
2265                   synchronize with this operation.
2266                 </p></dd>
2267 <dt><span class="term">Throws:</span></dt>
2268 <dd><p>
2269                   Nothing
2270                 </p></dd>
2271 </dl>
2272 </div>
2273 </div>
2274 <div class="section">
2275 <div class="titlepage"><div><div><h5 class="title">
2276 <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>
2277 </h5></div></div></div>
2278 <div class="variablelist">
2279 <p class="title"><b></b></p>
2280 <dl class="variablelist">
2281 <dt><span class="term">Precondition:</span></dt>
2282 <dd><p>
2283                   The calling thread has no ownership of the mutex.
2284                 </p></dd>
2285 <dt><span class="term">Effects:</span></dt>
2286 <dd><p>
2287                   If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2288                   is not exactly convertible to the native tick period, the duration
2289                   shall be rounded up to the nearest native tick period. Attempts
2290                   to obtain upgrade lock ownership for the calling thread within
2291                   the relative timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>.
2292                   If the time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2293                   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
2294                   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
2295                   the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2296                   only if it has obtained upgrade ownership of the mutex object.
2297                 </p></dd>
2298 <dt><span class="term">Returns:</span></dt>
2299 <dd><p>
2300                   <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2301                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2302                   otherwise.
2303                 </p></dd>
2304 <dt><span class="term">Postcondition:</span></dt>
2305 <dd><p>
2306                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2307                   the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2308                 </p></dd>
2309 <dt><span class="term">Synchronization:</span></dt>
2310 <dd><p>
2311                   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
2312                   synchronize with this operation.
2313                 </p></dd>
2314 <dt><span class="term">Throws:</span></dt>
2315 <dd><p>
2316                   Nothing
2317                 </p></dd>
2318 <dt><span class="term">Notes:</span></dt>
2319 <dd><p>
2320                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2321                   is defined on Windows platform
2322                 </p></dd>
2323 </dl>
2324 </div>
2325 </div>
2326 <div class="section">
2327 <div class="titlepage"><div><div><h5 class="title">
2328 <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>
2329 </h5></div></div></div>
2330 <div class="variablelist">
2331 <p class="title"><b></b></p>
2332 <dl class="variablelist">
2333 <dt><span class="term">Precondition:</span></dt>
2334 <dd><p>
2335                   The calling thread has no ownership of the mutex.
2336                 </p></dd>
2337 <dt><span class="term">Effects:</span></dt>
2338 <dd><p>
2339                   The function attempts to obtain upgrade ownership of the mutex.
2340                   If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2341                   already passed, the function attempts to obtain upgrade ownership
2342                   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
2343                   the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2344                   only if it has obtained upgrade ownership of the mutex object.
2345                 </p></dd>
2346 <dt><span class="term">Returns:</span></dt>
2347 <dd><p>
2348                   <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2349                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2350                   otherwise.
2351                 </p></dd>
2352 <dt><span class="term">Postcondition:</span></dt>
2353 <dd><p>
2354                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2355                   the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2356                 </p></dd>
2357 <dt><span class="term">Synchronization:</span></dt>
2358 <dd><p>
2359                   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
2360                   synchronize with this operation.
2361                 </p></dd>
2362 <dt><span class="term">Throws:</span></dt>
2363 <dd><p>
2364                   Nothing
2365                 </p></dd>
2366 <dt><span class="term">Notes:</span></dt>
2367 <dd><p>
2368                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2369                   is defined on Windows platform
2370                 </p></dd>
2371 </dl>
2372 </div>
2373 </div>
2374 <div class="section">
2375 <div class="titlepage"><div><div><h5 class="title">
2376 <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>
2377 </h5></div></div></div>
2378 <div class="variablelist">
2379 <p class="title"><b></b></p>
2380 <dl class="variablelist">
2381 <dt><span class="term">Precondition:</span></dt>
2382 <dd><p>
2383                   The calling thread must hold a shared lock on the mutex.
2384                 </p></dd>
2385 <dt><span class="term">Effects:</span></dt>
2386 <dd><p>
2387                   The function attempts to atomically convert the ownership from
2388                   shared to exclusive for the calling thread without blocking. For
2389                   this conversion to be successful, this thread must be the only
2390                   thread holding any ownership of the lock. If the conversion is
2391                   not successful, the shared ownership of m is retained.
2392                 </p></dd>
2393 <dt><span class="term">Returns:</span></dt>
2394 <dd><p>
2395                   <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2396                   ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2397                   otherwise.
2398                 </p></dd>
2399 <dt><span class="term">Postcondition:</span></dt>
2400 <dd><p>
2401                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2402                   the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2403                 </p></dd>
2404 <dt><span class="term">Synchronization:</span></dt>
2405 <dd><p>
2406                   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>
2407                   and subsequent lock operations on the same object synchronize with
2408                   this operation.
2409                 </p></dd>
2410 <dt><span class="term">Throws:</span></dt>
2411 <dd><p>
2412                   Nothing
2413                 </p></dd>
2414 <dt><span class="term">Notes:</span></dt>
2415 <dd><p>
2416                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2417                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2418                   is defined on Windows platform
2419                 </p></dd>
2420 </dl>
2421 </div>
2422 </div>
2423 <div class="section">
2424 <div class="titlepage"><div><div><h5 class="title">
2425 <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>
2426 </h5></div></div></div>
2427 <div class="variablelist">
2428 <p class="title"><b></b></p>
2429 <dl class="variablelist">
2430 <dt><span class="term">Precondition:</span></dt>
2431 <dd><p>
2432                   The calling thread shall hold a shared lock on the mutex.
2433                 </p></dd>
2434 <dt><span class="term">Effects:</span></dt>
2435 <dd><p>
2436                   If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2437                   is not exactly convertible to the native tick period, the duration
2438                   shall be rounded up to the nearest native tick period. The function
2439                   attempts to atomically convert the ownership from shared to exclusive
2440                   for the calling thread within the relative timeout specified by
2441                   <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2442                   time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2443                   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
2444                   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>).
2445                   The function shall return within the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> only if it has obtained
2446                   exclusive ownership of the mutex object. For this conversion to
2447                   be successful, this thread must be the only thread holding any
2448                   ownership of the lock at the moment of conversion. If the conversion
2449                   is not successful, the shared ownership of the mutex is retained.
2450                 </p></dd>
2451 <dt><span class="term">Returns:</span></dt>
2452 <dd><p>
2453                   <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2454                   ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2455                   otherwise.
2456                 </p></dd>
2457 <dt><span class="term">Postcondition:</span></dt>
2458 <dd><p>
2459                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2460                   the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2461                 </p></dd>
2462 <dt><span class="term">Synchronization:</span></dt>
2463 <dd><p>
2464                   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>
2465                   and subsequent lock operations on the same object synchronize with
2466                   this operation.
2467                 </p></dd>
2468 <dt><span class="term">Throws:</span></dt>
2469 <dd><p>
2470                   Nothing
2471                 </p></dd>
2472 <dt><span class="term">Notes:</span></dt>
2473 <dd><p>
2474                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2475                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2476                   is defined on Windows platform
2477                 </p></dd>
2478 </dl>
2479 </div>
2480 </div>
2481 <div class="section">
2482 <div class="titlepage"><div><div><h5 class="title">
2483 <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>
2484 </h5></div></div></div>
2485 <div class="variablelist">
2486 <p class="title"><b></b></p>
2487 <dl class="variablelist">
2488 <dt><span class="term">Precondition:</span></dt>
2489 <dd><p>
2490                   The calling thread shall hold a shared lock on the mutex.
2491                 </p></dd>
2492 <dt><span class="term">Effects:</span></dt>
2493 <dd><p>
2494                   The function attempts to atomically convert the ownership from
2495                   shared to exclusive for the calling thread within the absolute
2496                   timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2497                   If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2498                   already passed, the function attempts to obtain exclusive ownership
2499                   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
2500                   the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2501                   only if it has obtained exclusive ownership of the mutex object.
2502                   For this conversion to be successful, this thread must be the only
2503                   thread holding any ownership of the lock at the moment of conversion.
2504                   If the conversion is not successful, the shared ownership of the
2505                   mutex is retained.
2506                 </p></dd>
2507 <dt><span class="term">Returns:</span></dt>
2508 <dd><p>
2509                   <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2510                   ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2511                   otherwise.
2512                 </p></dd>
2513 <dt><span class="term">Postcondition:</span></dt>
2514 <dd><p>
2515                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2516                   the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2517                 </p></dd>
2518 <dt><span class="term">Synchronization:</span></dt>
2519 <dd><p>
2520                   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>
2521                   and subsequent lock operations on the same object synchronize with
2522                   this operation.
2523                 </p></dd>
2524 <dt><span class="term">Throws:</span></dt>
2525 <dd><p>
2526                   Nothing
2527                 </p></dd>
2528 <dt><span class="term">Notes:</span></dt>
2529 <dd><p>
2530                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2531                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2532                   is defined on Windows platform
2533                 </p></dd>
2534 </dl>
2535 </div>
2536 </div>
2537 <div class="section">
2538 <div class="titlepage"><div><div><h5 class="title">
2539 <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>
2540 </h5></div></div></div>
2541 <div class="variablelist">
2542 <p class="title"><b></b></p>
2543 <dl class="variablelist">
2544 <dt><span class="term">Precondition:</span></dt>
2545 <dd><p>
2546                   The calling thread shall hold an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
2547                 </p></dd>
2548 <dt><span class="term">Effects:</span></dt>
2549 <dd><p>
2550                   Atomically converts the ownership from exclusive to shared for
2551                   the calling thread.
2552                 </p></dd>
2553 <dt><span class="term">Postcondition:</span></dt>
2554 <dd><p>
2555                   The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2556                 </p></dd>
2557 <dt><span class="term">Synchronization:</span></dt>
2558 <dd><p>
2559                   This operation synchronizes with subsequent lock operations that
2560                   obtain ownership of the same object.
2561                 </p></dd>
2562 <dt><span class="term">Throws:</span></dt>
2563 <dd><p>
2564                   Nothing
2565                 </p></dd>
2566 </dl>
2567 </div>
2568 </div>
2569 <div class="section">
2570 <div class="titlepage"><div><div><h5 class="title">
2571 <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>
2572 </h5></div></div></div>
2573 <div class="variablelist">
2574 <p class="title"><b></b></p>
2575 <dl class="variablelist">
2576 <dt><span class="term">Precondition:</span></dt>
2577 <dd><p>
2578                   The calling thread shall hold a shared lock on the mutex.
2579                 </p></dd>
2580 <dt><span class="term">Effects:</span></dt>
2581 <dd><p>
2582                   The function attempts to atomically convert the ownership from
2583                   shared to upgrade for the calling thread without blocking. For
2584                   this conversion to be successful, there must be no thread holding
2585                   upgrade ownership of this object. If the conversion is not successful,
2586                   the shared ownership of the mutex is retained.
2587                 </p></dd>
2588 <dt><span class="term">Returns:</span></dt>
2589 <dd><p>
2590                   <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2591                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2592                   otherwise.
2593                 </p></dd>
2594 <dt><span class="term">Postcondition:</span></dt>
2595 <dd><p>
2596                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2597                   the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2598                 </p></dd>
2599 <dt><span class="term">Synchronization:</span></dt>
2600 <dd><p>
2601                   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
2602                   on the same object synchronize with this operation.
2603                 </p></dd>
2604 <dt><span class="term">Throws:</span></dt>
2605 <dd><p>
2606                   Nothing
2607                 </p></dd>
2608 <dt><span class="term">Notes:</span></dt>
2609 <dd><p>
2610                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2611                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2612                   is defined on Windows platform
2613                 </p></dd>
2614 </dl>
2615 </div>
2616 </div>
2617 <div class="section">
2618 <div class="titlepage"><div><div><h5 class="title">
2619 <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>
2620 </h5></div></div></div>
2621 <div class="variablelist">
2622 <p class="title"><b></b></p>
2623 <dl class="variablelist">
2624 <dt><span class="term">Precondition:</span></dt>
2625 <dd><p>
2626                   The calling thread shall hold a shared lock on the mutex.
2627                 </p></dd>
2628 <dt><span class="term">Effects:</span></dt>
2629 <dd><p>
2630                   If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2631                   is not exactly convertible to the native tick period, the duration
2632                   shall be rounded up to the nearest native tick period. The function
2633                   attempts to atomically convert the ownership from shared to upgrade
2634                   for the calling thread within the relative timeout specified by
2635                   <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2636                   time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2637                   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
2638                   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
2639                   the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2640                   only if it has obtained exclusive ownership of the mutex object.
2641                   For this conversion to be successful, there must be no thread holding
2642                   upgrade ownership of this object at the moment of conversion. If
2643                   the conversion is not successful, the shared ownership of m is
2644                   retained.
2645                 </p></dd>
2646 <dt><span class="term">Returns:</span></dt>
2647 <dd><p>
2648                   <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2649                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2650                   otherwise.
2651                 </p></dd>
2652 <dt><span class="term">Postcondition:</span></dt>
2653 <dd><p>
2654                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2655                   the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2656                 </p></dd>
2657 <dt><span class="term">Synchronization:</span></dt>
2658 <dd><p>
2659                   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
2660                   on the same object synchronize with this operation.
2661                 </p></dd>
2662 <dt><span class="term">Throws:</span></dt>
2663 <dd><p>
2664                   Nothing
2665                 </p></dd>
2666 <dt><span class="term">Notes:</span></dt>
2667 <dd><p>
2668                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2669                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2670                   is defined on Windows platform
2671                 </p></dd>
2672 </dl>
2673 </div>
2674 </div>
2675 <div class="section">
2676 <div class="titlepage"><div><div><h5 class="title">
2677 <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>
2678 </h5></div></div></div>
2679 <div class="variablelist">
2680 <p class="title"><b></b></p>
2681 <dl class="variablelist">
2682 <dt><span class="term">Precondition:</span></dt>
2683 <dd><p>
2684                   The calling thread shall hold a shared lock on the mutex.
2685                 </p></dd>
2686 <dt><span class="term">Effects:</span></dt>
2687 <dd><p>
2688                   The function attempts to atomically convert the ownership from
2689                   shared to upgrade for the calling thread within the absolute timeout
2690                   specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2691                   If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2692                   already passed, the function attempts to obtain upgrade ownership
2693                   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
2694                   the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2695                   only if it has obtained upgrade ownership of the mutex object.
2696                   For this conversion to be successful, there must be no thread holding
2697                   upgrade ownership of this object at the moment of conversion. If
2698                   the conversion is not successful, the shared ownership of the mutex
2699                   is retained.
2700                 </p></dd>
2701 <dt><span class="term">Returns:</span></dt>
2702 <dd><p>
2703                   <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2704                   was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2705                   otherwise.
2706                 </p></dd>
2707 <dt><span class="term">Postcondition:</span></dt>
2708 <dd><p>
2709                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2710                   the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2711                 </p></dd>
2712 <dt><span class="term">Synchronization:</span></dt>
2713 <dd><p>
2714                   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
2715                   on the same object synchronize with this operation.
2716                 </p></dd>
2717 <dt><span class="term">Throws:</span></dt>
2718 <dd><p>
2719                   Nothing
2720                 </p></dd>
2721 <dt><span class="term">Notes:</span></dt>
2722 <dd><p>
2723                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
2724                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2725                   is defined on Windows platform
2726                 </p></dd>
2727 </dl>
2728 </div>
2729 </div>
2730 <div class="section">
2731 <div class="titlepage"><div><div><h5 class="title">
2732 <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>
2733 </h5></div></div></div>
2734 <div class="variablelist">
2735 <p class="title"><b></b></p>
2736 <dl class="variablelist">
2737 <dt><span class="term">Precondition:</span></dt>
2738 <dd><p>
2739                   The current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2740                 </p></dd>
2741 <dt><span class="term">Effects:</span></dt>
2742 <dd><p>
2743                   Atomically releases exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2744                   by the current thread and acquires upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code> without blocking.
2745                 </p></dd>
2746 <dt><span class="term">Postcondition:</span></dt>
2747 <dd><p>
2748                   The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2749                 </p></dd>
2750 <dt><span class="term">Synchronization:</span></dt>
2751 <dd><p>
2752                   This operation synchronizes with subsequent lock operations that
2753                   obtain ownership of the same object.
2754                 </p></dd>
2755 <dt><span class="term">Throws:</span></dt>
2756 <dd><p>
2757                   Nothing
2758                 </p></dd>
2759 </dl>
2760 </div>
2761 </div>
2762 <div class="section">
2763 <div class="titlepage"><div><div><h5 class="title">
2764 <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>
2765 </h5></div></div></div>
2766 <div class="variablelist">
2767 <p class="title"><b></b></p>
2768 <dl class="variablelist">
2769 <dt><span class="term">Precondition:</span></dt>
2770 <dd><p>
2771                   The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2772                 </p></dd>
2773 <dt><span class="term">Effects:</span></dt>
2774 <dd><p>
2775                   Atomically releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2776                   by the current thread and acquires exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. If any other threads have
2777                   shared ownership, blocks until exclusive ownership can be acquired.
2778                 </p></dd>
2779 <dt><span class="term">Postcondition:</span></dt>
2780 <dd><p>
2781                   The current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2782                 </p></dd>
2783 <dt><span class="term">Synchronization:</span></dt>
2784 <dd><p>
2785                   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
2786                   that obtain ownership of the same object.
2787                 </p></dd>
2788 <dt><span class="term">Throws:</span></dt>
2789 <dd><p>
2790                   Nothing
2791                 </p></dd>
2792 </dl>
2793 </div>
2794 </div>
2795 <div class="section">
2796 <div class="titlepage"><div><div><h5 class="title">
2797 <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>
2798 </h5></div></div></div>
2799 <div class="variablelist">
2800 <p class="title"><b></b></p>
2801 <dl class="variablelist">
2802 <dt><span class="term">Precondition:</span></dt>
2803 <dd><p>
2804                   The calling thread shall hold a upgrade lock on the mutex.
2805                 </p></dd>
2806 <dt><span class="term">Effects:</span></dt>
2807 <dd><p>
2808                   The function attempts to atomically convert the ownership from
2809                   upgrade to exclusive for the calling thread without blocking. For
2810                   this conversion to be successful, this thread must be the only
2811                   thread holding any ownership of the lock. If the conversion is
2812                   not successful, the upgrade ownership of m is retained.
2813                 </p></dd>
2814 <dt><span class="term">Returns:</span></dt>
2815 <dd><p>
2816                   <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2817                   ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2818                   otherwise.
2819                 </p></dd>
2820 <dt><span class="term">Postcondition:</span></dt>
2821 <dd><p>
2822                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2823                   the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2824                 </p></dd>
2825 <dt><span class="term">Synchronization:</span></dt>
2826 <dd><p>
2827                   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>
2828                   and subsequent lock operations on the same object synchronize with
2829                   this operation.
2830                 </p></dd>
2831 <dt><span class="term">Throws:</span></dt>
2832 <dd><p>
2833                   Nothing
2834                 </p></dd>
2835 <dt><span class="term">Notes:</span></dt>
2836 <dd><p>
2837                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2838                   is defined on Windows platform
2839                 </p></dd>
2840 </dl>
2841 </div>
2842 </div>
2843 <div class="section">
2844 <div class="titlepage"><div><div><h5 class="title">
2845 <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>
2846 </h5></div></div></div>
2847 <div class="variablelist">
2848 <p class="title"><b></b></p>
2849 <dl class="variablelist">
2850 <dt><span class="term">Precondition:</span></dt>
2851 <dd><p>
2852                   The calling thread shall hold a upgrade lock on the mutex.
2853                 </p></dd>
2854 <dt><span class="term">Effects:</span></dt>
2855 <dd><p>
2856                   If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2857                   is not exactly convertible to the native tick period, the duration
2858                   shall be rounded up to the nearest native tick period. The function
2859                   attempts to atomically convert the ownership from upgrade to exclusive
2860                   for the calling thread within the relative timeout specified by
2861                   <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2862                   time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2863                   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
2864                   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
2865                   the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2866                   only if it has obtained exclusive ownership of the mutex object.
2867                   For this conversion to be successful, this thread shall be the
2868                   only thread holding any ownership of the lock at the moment of
2869                   conversion. If the conversion is not successful, the upgrade ownership
2870                   of m is retained.
2871                 </p></dd>
2872 <dt><span class="term">Returns:</span></dt>
2873 <dd><p>
2874                   <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2875                   ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2876                   otherwise.
2877                 </p></dd>
2878 <dt><span class="term">Postcondition:</span></dt>
2879 <dd><p>
2880                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2881                   the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2882                 </p></dd>
2883 <dt><span class="term">Synchronization:</span></dt>
2884 <dd><p>
2885                   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>
2886                   and subsequent lock operations on the same object synchronize with
2887                   this operation.
2888                 </p></dd>
2889 <dt><span class="term">Throws:</span></dt>
2890 <dd><p>
2891                   Nothing
2892                 </p></dd>
2893 <dt><span class="term">Notes:</span></dt>
2894 <dd><p>
2895                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2896                   is defined on Windows platform
2897                 </p></dd>
2898 </dl>
2899 </div>
2900 </div>
2901 <div class="section">
2902 <div class="titlepage"><div><div><h5 class="title">
2903 <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>
2904 </h5></div></div></div>
2905 <div class="variablelist">
2906 <p class="title"><b></b></p>
2907 <dl class="variablelist">
2908 <dt><span class="term">Precondition:</span></dt>
2909 <dd><p>
2910                   The calling thread shall hold a upgrade lock on the mutex.
2911                 </p></dd>
2912 <dt><span class="term">Effects:</span></dt>
2913 <dd><p>
2914                   The function attempts to atomically convert the ownership from
2915                   upgrade to exclusive for the calling thread within the absolute
2916                   timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2917                   If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2918                   already passed, the function attempts to obtain exclusive ownership
2919                   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
2920                   the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2921                   only if it has obtained exclusive ownership of the mutex object.
2922                   For this conversion to be successful, this thread shall be the
2923                   only thread holding any ownership of the lock at the moment of
2924                   conversion. If the conversion is not successful, the upgrade ownership
2925                   of m is retained.
2926                 </p></dd>
2927 <dt><span class="term">Returns:</span></dt>
2928 <dd><p>
2929                   <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2930                   ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2931                   otherwise.
2932                 </p></dd>
2933 <dt><span class="term">Postcondition:</span></dt>
2934 <dd><p>
2935                   If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2936                   the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2937                 </p></dd>
2938 <dt><span class="term">Synchronization:</span></dt>
2939 <dd><p>
2940                   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>
2941                   and subsequent lock operations on the same object synchronize with
2942                   this operation.
2943                 </p></dd>
2944 <dt><span class="term">Throws:</span></dt>
2945 <dd><p>
2946                   Nothing
2947                 </p></dd>
2948 <dt><span class="term">Notes:</span></dt>
2949 <dd><p>
2950                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2951                   is defined on Windows platform
2952                 </p></dd>
2953 </dl>
2954 </div>
2955 </div>
2956 <div class="section">
2957 <div class="titlepage"><div><div><h5 class="title">
2958 <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>
2959 </h5></div></div></div>
2960 <div class="variablelist">
2961 <p class="title"><b></b></p>
2962 <dl class="variablelist">
2963 <dt><span class="term">Precondition:</span></dt>
2964 <dd><p>
2965                   The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2966                 </p></dd>
2967 <dt><span class="term">Effects:</span></dt>
2968 <dd><p>
2969                   Atomically releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2970                   by the current thread and acquires shared ownership of <code class="computeroutput"><span class="identifier">m</span></code> without blocking.
2971                 </p></dd>
2972 <dt><span class="term">Postcondition:</span></dt>
2973 <dd><p>
2974                   The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2975                 </p></dd>
2976 <dt><span class="term">Synchronization:</span></dt>
2977 <dd><p>
2978                   This operation synchronizes with prior <code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code> and subsequent lock operations
2979                   that obtain ownership of the same object.
2980                 </p></dd>
2981 <dt><span class="term">Throws:</span></dt>
2982 <dd><p>
2983                   Nothing
2984                 </p></dd>
2985 </dl>
2986 </div>
2987 </div>
2988 </div>
2989 </div>
2990 <div class="section">
2991 <div class="titlepage"><div><div><h3 class="title">
2992 <a name="thread.synchronization.lock_option"></a><a class="link" href="synchronization.html#thread.synchronization.lock_option" title="Lock Options">Lock Options</a>
2993 </h3></div></div></div>
2994 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_option.lock_tags">Lock
2995         option tags</a></span></dt></dl></div>
2996 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt; </span>
2997 <span class="comment">// #include &lt;boost/thread/locks_options.hpp&gt; </span>
2998
2999 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3000 <span class="special">{</span>
3001   <span class="keyword">struct</span> <span class="identifier">defer_lock_t</span> <span class="special">{};</span>
3002   <span class="keyword">struct</span> <span class="identifier">try_to_lock_t</span> <span class="special">{};</span>
3003   <span class="keyword">struct</span> <span class="identifier">adopt_lock_t</span> <span class="special">{};</span>
3004   <span class="keyword">constexpr</span> <span class="identifier">defer_lock_t</span> <span class="identifier">defer_lock</span><span class="special">;</span>
3005   <span class="keyword">constexpr</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">try_to_lock</span><span class="special">;</span>
3006   <span class="keyword">constexpr</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">adopt_lock</span><span class="special">;</span>
3007 </pre>
3008 <div class="section">
3009 <div class="titlepage"><div><div><h4 class="title">
3010 <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
3011         option tags</a>
3012 </h4></div></div></div>
3013 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
3014 <span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
3015
3016 <span class="keyword">struct</span> <span class="identifier">defer_lock_t</span> <span class="special">{};</span>
3017 <span class="keyword">struct</span> <span class="identifier">try_to_lock_t</span> <span class="special">{};</span>
3018 <span class="keyword">struct</span> <span class="identifier">adopt_lock_t</span> <span class="special">{};</span>
3019 <span class="keyword">const</span> <span class="identifier">defer_lock_t</span> <span class="identifier">defer_lock</span><span class="special">;</span>
3020 <span class="keyword">const</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">try_to_lock</span><span class="special">;</span>
3021 <span class="keyword">const</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">adopt_lock</span><span class="special">;</span>
3022 </pre>
3023 <p>
3024           These tags are used in scoped locks constructors to specify a specific
3025           behavior.
3026         </p>
3027 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3028 <li class="listitem">
3029               <code class="computeroutput"><span class="identifier">defer_lock_t</span></code>: is used
3030               to construct the scoped lock without locking it.
3031             </li>
3032 <li class="listitem">
3033               <code class="computeroutput"><span class="identifier">try_to_lock_t</span></code>: is used
3034               to construct the scoped lock trying to lock it.
3035             </li>
3036 <li class="listitem">
3037               <code class="computeroutput"><span class="identifier">adopt_lock_t</span></code>: is used
3038               to construct the scoped lock without locking it but adopting ownership.
3039             </li>
3040 </ul></div>
3041 </div>
3042 </div>
3043 <div class="section">
3044 <div class="titlepage"><div><div><h3 class="title">
3045 <a name="thread.synchronization.lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard" title="Lock Guard">Lock Guard</a>
3046 </h3></div></div></div>
3047 <div class="toc"><dl class="toc">
3048 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard">Class
3049         template <code class="computeroutput"><span class="identifier">lock_guard</span></code></a></span></dt>
3050 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard">Non
3051         Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a></span></dt>
3052 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard_adopt">Non
3053         Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a></span></dt>
3054 </dl></div>
3055 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt; </span>
3056 <span class="comment">// #include &lt;boost/thread/lock_guard.hpp&gt; </span>
3057
3058 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3059 <span class="special">{</span>
3060
3061   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3062   <span class="keyword">class</span> <span class="identifier">lock_guard</span>
3063 <span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_LOCK_GUARD</span>
3064   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3065   <span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
3066   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3067   <span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
3068 <span class="preprocessor">#endif</span>
3069 <span class="special">}</span>
3070 </pre>
3071 <div class="section">
3072 <div class="titlepage"><div><div><h4 class="title">
3073 <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
3074         template <code class="computeroutput"><span class="identifier">lock_guard</span></code></a>
3075 </h4></div></div></div>
3076 <div class="toc"><dl class="toc">
3077 <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">&amp;</span>
3078           <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
3079 <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">&amp;</span>
3080           <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>
3081 <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>
3082 </dl></div>
3083 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
3084 <span class="comment">// #include &lt;boost/thread/lock_guard.hpp&gt; </span>
3085
3086 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3087 <span class="keyword">class</span> <span class="identifier">lock_guard</span>
3088 <span class="special">{</span>
3089 <span class="keyword">public</span><span class="special">:</span>
3090     <span class="keyword">explicit</span> <span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
3091     <span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
3092
3093     <span class="special">~</span><span class="identifier">lock_guard</span><span class="special">();</span>
3094 <span class="special">};</span>
3095 </pre>
3096 <p>
3097           <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
3098           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
3099           constructor parameter. On destruction, the ownership is released. This
3100           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
3101           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 &amp; 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">&amp;</span>
3102           <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>
3103           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
3104           of a lock already held by the current thread.
3105         </p>
3106 <div class="section">
3107 <div class="titlepage"><div><div><h5 class="title">
3108 <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 &amp; m)"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3109           <span class="identifier">m</span><span class="special">)</span></code></a>
3110 </h5></div></div></div>
3111 <div class="variablelist">
3112 <p class="title"><b></b></p>
3113 <dl class="variablelist">
3114 <dt><span class="term">Effects:</span></dt>
3115 <dd><p>
3116                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3117                   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>.
3118                 </p></dd>
3119 <dt><span class="term">Throws:</span></dt>
3120 <dd><p>
3121                   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>.
3122                 </p></dd>
3123 </dl>
3124 </div>
3125 </div>
3126 <div class="section">
3127 <div class="titlepage"><div><div><h5 class="title">
3128 <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 &amp; 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">&amp;</span>
3129           <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>
3130 </h5></div></div></div>
3131 <div class="variablelist">
3132 <p class="title"><b></b></p>
3133 <dl class="variablelist">
3134 <dt><span class="term">Precondition:</span></dt>
3135 <dd><p>
3136                   The current thread owns a lock on <code class="computeroutput"><span class="identifier">m</span></code>
3137                   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>.
3138                 </p></dd>
3139 <dt><span class="term">Effects:</span></dt>
3140 <dd><p>
3141                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3142                   Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
3143                 </p></dd>
3144 <dt><span class="term">Throws:</span></dt>
3145 <dd><p>
3146                   Nothing.
3147                 </p></dd>
3148 </dl>
3149 </div>
3150 </div>
3151 <div class="section">
3152 <div class="titlepage"><div><div><h5 class="title">
3153 <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>
3154 </h5></div></div></div>
3155 <div class="variablelist">
3156 <p class="title"><b></b></p>
3157 <dl class="variablelist">
3158 <dt><span class="term">Effects:</span></dt>
3159 <dd><p>
3160                   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>
3161                   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
3162                   to the constructor.
3163                 </p></dd>
3164 <dt><span class="term">Throws:</span></dt>
3165 <dd><p>
3166                   Nothing.
3167                 </p></dd>
3168 </dl>
3169 </div>
3170 </div>
3171 </div>
3172 <div class="section">
3173 <div class="titlepage"><div><div><h4 class="title">
3174 <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
3175         Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a>
3176 </h4></div></div></div>
3177 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3178 <span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
3179 </pre>
3180 <div class="variablelist">
3181 <p class="title"><b></b></p>
3182 <dl class="variablelist">
3183 <dt><span class="term">Returns:</span></dt>
3184 <dd><p>
3185                 a lock_guard as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">}</span></code>.
3186               </p></dd>
3187 <dt><span class="term">Throws:</span></dt>
3188 <dd><p>
3189                 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>.
3190               </p></dd>
3191 </dl>
3192 </div>
3193 </div>
3194 <div class="section">
3195 <div class="titlepage"><div><div><h4 class="title">
3196 <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
3197         Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a>
3198 </h4></div></div></div>
3199 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3200 <span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
3201 </pre>
3202 <div class="variablelist">
3203 <p class="title"><b></b></p>
3204 <dl class="variablelist">
3205 <dt><span class="term">Returns:</span></dt>
3206 <dd><p>
3207                 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>.
3208               </p></dd>
3209 <dt><span class="term">Throws:</span></dt>
3210 <dd><p>
3211                 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>.
3212               </p></dd>
3213 </dl>
3214 </div>
3215 </div>
3216 </div>
3217 <div class="section">
3218 <div class="titlepage"><div><div><h3 class="title">
3219 <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>
3220 </h3></div></div></div>
3221 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.with_lock_guard.with_lock_guard">Non
3222         Member Function <code class="computeroutput"><span class="identifier">with_lock_guard</span></code></a></span></dt></dl></div>
3223 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/with_lock_guard.hpp&gt;</span>
3224
3225 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3226 <span class="special">{</span>
3227   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3228   <span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">)</span> <span class="special">-&gt;</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">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...));</span>
3229 <span class="special">}</span>
3230 </pre>
3231 <div class="section">
3232 <div class="titlepage"><div><div><h4 class="title">
3233 <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
3234         Member Function <code class="computeroutput"><span class="identifier">with_lock_guard</span></code></a>
3235 </h4></div></div></div>
3236 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3237 <span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span>
3238     <span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span>
3239     <span class="identifier">Function</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">,</span>
3240     <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span>
3241 <span class="special">)</span> <span class="special">-&gt;</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">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...));</span>
3242 </pre>
3243 <div class="variablelist">
3244 <p class="title"><b></b></p>
3245 <dl class="variablelist">
3246 <dt><span class="term">Precondition:</span></dt>
3247 <dd><p>
3248                 <code class="computeroutput"><span class="identifier">m</span></code> must be in unlocked
3249                 state
3250               </p></dd>
3251 <dt><span class="term">Effects:</span></dt>
3252 <dd><p>
3253                 call <code class="computeroutput"><span class="identifier">func</span></code> in scope
3254                 locked by <code class="computeroutput"><span class="identifier">m</span></code>
3255               </p></dd>
3256 <dt><span class="term">Returns:</span></dt>
3257 <dd><p>
3258                 Result of <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">args</span><span class="special">...)</span></code>
3259                 call
3260               </p></dd>
3261 <dt><span class="term">Throws:</span></dt>
3262 <dd><p>
3263                 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>
3264                 and <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">args</span><span class="special">...)</span></code>
3265               </p></dd>
3266 <dt><span class="term">Postcondition:</span></dt>
3267 <dd><p>
3268                 <code class="computeroutput"><span class="identifier">m</span></code> is in unlocked
3269                 state
3270               </p></dd>
3271 <dt><span class="term">Limitations:</span></dt>
3272 <dd><p>
3273                 Without c++11 variadic templates support number of arguments is limited
3274                 to <code class="computeroutput"><span class="number">4</span></code>
3275               </p></dd>
3276 <dt><span class="term"></span></dt>
3277 <dd><p>
3278                 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
3279               </p></dd>
3280 <dt><span class="term"></span></dt>
3281 <dd><p>
3282                 For correct work with lambda macro <code class="computeroutput"><span class="identifier">BOOST_RESULT_OF_USE_DECLTYPE</span></code>
3283                 may be needed to define
3284               </p></dd>
3285 </dl>
3286 </div>
3287 </div>
3288 </div>
3289 <div class="section">
3290 <div class="titlepage"><div><div><h3 class="title">
3291 <a name="thread.synchronization.lock_concepts"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts" title="Lock Concepts">Lock Concepts</a>
3292 </h3></div></div></div>
3293 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock">StrictLock
3294         -- EXTENSION</a></span></dt></dl></div>
3295 <div class="section">
3296 <div class="titlepage"><div><div><h4 class="title">
3297 <a name="thread.synchronization.lock_concepts.StrictLock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION">StrictLock
3298         -- EXTENSION</a>
3299 </h4></div></div></div>
3300 <div class="toc"><dl class="toc">
3301 <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>
3302 <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">&lt;</span><span class="identifier">L</span><span class="special">&gt;</span></code></a></span></dt>
3303 <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>
3304 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.models">Models</a></span></dt>
3305 </dl></div>
3306 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lock_concepts.hpp&gt; </span>
3307
3308 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3309 <span class="special">{</span>
3310
3311   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
3312   <span class="keyword">class</span> <span class="identifier">StrictLock</span><span class="special">;</span>
3313 <span class="special">}</span>
3314 </pre>
3315 <p>
3316           A StrictLock is a lock that ensures that the associated mutex is locked
3317           during the lifetime of the lock.
3318         </p>
3319 <p>
3320           A type <code class="computeroutput"><span class="identifier">L</span></code> meets the StrictLock
3321           requirements if the following expressions are well-formed and have the
3322           specified semantics
3323         </p>
3324 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3325 <li class="listitem">
3326               <code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code>
3327             </li>
3328 <li class="listitem">
3329               <code class="computeroutput"><span class="identifier">is_strict_lock</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">&gt;</span></code>
3330             </li>
3331 <li class="listitem">
3332               <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>
3333             </li>
3334 </ul></div>
3335 <p>
3336           and BasicLockable&lt;L::mutex_type&gt;
3337         </p>
3338 <p>
3339           where
3340         </p>
3341 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3342 <li class="listitem">
3343               <code class="computeroutput"><span class="identifier">cl</span></code> denotes a value
3344               of type <code class="computeroutput"><span class="identifier">L</span> <span class="keyword">const</span><span class="special">&amp;</span></code>,
3345             </li>
3346 <li class="listitem">
3347               <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
3348               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>,
3349             </li>
3350 </ul></div>
3351 <div class="section">
3352 <div class="titlepage"><div><div><h5 class="title">
3353 <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>
3354 </h5></div></div></div>
3355 <p>
3356             The type L::mutex_type denotes the mutex that is locked by this lock.
3357           </p>
3358 </div>
3359 <div class="section">
3360 <div class="titlepage"><div><div><h5 class="title">
3361 <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&lt;L&gt;"><code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">&gt;</span></code></a>
3362 </h5></div></div></div>
3363 <p>
3364             As the semantic "ensures that the associated mutex is locked during
3365             the lifetime of the lock. " can not be described by syntactic requirements
3366             a <code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span></code>
3367             trait must be specialized by the user defining the lock so that the following
3368             assertion is true:
3369           </p>
3370 <pre class="programlisting"><span class="identifier">is_strict_lock_sur_parole</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">==</span> <span class="keyword">true</span>
3371 </pre>
3372 </div>
3373 <div class="section">
3374 <div class="titlepage"><div><div><h5 class="title">
3375 <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>
3376 </h5></div></div></div>
3377 <div class="variablelist">
3378 <p class="title"><b></b></p>
3379 <dl class="variablelist">
3380 <dt><span class="term">Return Type:</span></dt>
3381 <dd><p>
3382                   <code class="computeroutput"><span class="keyword">bool</span></code>
3383                 </p></dd>
3384 <dt><span class="term">Returns:</span></dt>
3385 <dd><p>
3386                   Whether the strict lock is locking the mutex <code class="computeroutput"><span class="identifier">m</span></code>
3387                 </p></dd>
3388 <dt><span class="term">Throws:</span></dt>
3389 <dd><p>
3390                   Nothing.
3391                 </p></dd>
3392 </dl>
3393 </div>
3394 </div>
3395 <div class="section">
3396 <div class="titlepage"><div><div><h5 class="title">
3397 <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>
3398 </h5></div></div></div>
3399 <p>
3400             The following classes are models of <code class="computeroutput"><span class="identifier">StrictLock</span></code>:
3401           </p>
3402 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3403 <li class="listitem">
3404                 strict_lock: ensured by construction,
3405               </li>
3406 <li class="listitem">
3407                 nested_strict_lock: "sur parole" as the user could use
3408                 adopt_lock_t on unique_lock constructor overload without having locked
3409                 the mutex,
3410               </li>
3411 <li class="listitem">
3412                 <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"
3413                 as the user could use adopt_lock_t constructor overload without having
3414                 locked the mutex.
3415               </li>
3416 </ul></div>
3417 </div>
3418 </div>
3419 </div>
3420 <div class="section">
3421 <div class="titlepage"><div><div><h3 class="title">
3422 <a name="thread.synchronization.locks"></a><a class="link" href="synchronization.html#thread.synchronization.locks" title="Lock Types">Lock Types</a>
3423 </h3></div></div></div>
3424 <div class="toc"><dl class="toc">
3425 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock">Class template
3426         <code class="computeroutput"><span class="identifier">unique_lock</span></code></a></span></dt>
3427 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock">Class template
3428         <code class="computeroutput"><span class="identifier">shared_lock</span></code> - C++14</a></span></dt>
3429 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.upgrade_lock">Class template
3430         <code class="computeroutput"><span class="identifier">upgrade_lock</span></code> - EXTENSION</a></span></dt>
3431 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock">Class
3432         template <code class="computeroutput"><span class="identifier">upgrade_to_unique_lock</span></code>
3433         -- EXTENSION</a></span></dt>
3434 <dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.scoped_try_lock">Mutex-specific
3435         class <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> --
3436         DEPRECATED</a></span></dt>
3437 </dl></div>
3438 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt; </span>
3439 <span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
3440
3441 <span class="keyword">namespace</span> <span class="identifier">boost</span>
3442 <span class="special">{</span>
3443
3444   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3445   <span class="keyword">class</span> <span class="identifier">unique_lock</span><span class="special">;</span>
3446   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">&gt;</span>
3447   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">unique_lock</span> <span class="special">&lt;</span><span class="identifier">Mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">unique_lock</span> <span class="special">&lt;</span><span class="identifier">Mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
3448   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3449   <span class="keyword">class</span> <span class="identifier">shared_lock</span><span class="special">;</span> <span class="comment">// C++14</span>
3450   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">&gt;</span>
3451   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">Mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lhs</span><span class="special">,</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">Mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// C++14</span>
3452   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3453   <span class="keyword">class</span> <span class="identifier">upgrade_lock</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
3454   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">&gt;</span>
3455   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_lock</span> <span class="special">&lt;</span><span class="identifier">Mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">upgrade_lock</span> <span class="special">&lt;</span><span class="identifier">Mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
3456   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Mutex</span><span class="special">&gt;</span>
3457   <span class="keyword">class</span> <span class="identifier">upgrade_to_unique_lock</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
3458 <span class="special">}</span>
3459 </pre>
3460 <div class="section">
3461 <div class="titlepage"><div><div><h4 class="title">
3462 <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
3463         <code class="computeroutput"><span class="identifier">unique_lock</span></code></a>
3464 </h4></div></div></div>
3465 <div class="toc"><dl class="toc">
3466 <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>
3467 <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">&amp;</span>
3468           <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
3469 <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">&amp;</span>
3470           <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>
3471 <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">&amp;</span>
3472           <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>
3473 <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">&amp;</span>
3474           <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>
3475 <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">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span>
3476           <span class="identifier">sl</span><span class="special">,</span>
3477           <span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt>
3478 <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">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;,</span>
3479           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;)</span></code></a></span></dt>
3480 <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">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;,</span>
3481           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;)</span></code></a></span></dt>
3482 <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">&amp;</span>
3483           <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">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
3484 <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">&lt;</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">&gt;</span>
3485           <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3486           <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
3487 <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">&lt;</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">&gt;</span>
3488           <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3489           <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
3490 <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>
3491 <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>
3492 <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>
3493 <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>
3494           <span class="keyword">bool</span><span class="special">()</span>
3495           <span class="keyword">const</span></code></a></span></dt>
3496 <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>
3497 </dl></div>
3498 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
3499 <span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
3500
3501 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3502 <span class="keyword">class</span> <span class="identifier">unique_lock</span>
3503 <span class="special">{</span>
3504 <span class="keyword">public</span><span class="special">:</span>
3505     <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
3506     <span class="identifier">unique_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
3507     <span class="keyword">explicit</span> <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
3508     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
3509     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
3510     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span>
3511
3512 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span>
3513     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</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>
3514     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3515     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">sl</span><span class="special">,</span>
3516                 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span> <span class="comment">// C++14</span>
3517     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3518     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">sl</span><span class="special">,</span>
3519                 <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span> <span class="comment">// C++14</span>
3520 <span class="preprocessor">#endif</span>
3521
3522     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3523     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
3524     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3525     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">d</span><span class="special">);</span>
3526     <span class="special">~</span><span class="identifier">unique_lock</span><span class="special">();</span>
3527
3528     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">unique_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
3529     <span class="identifier">unique_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">unique_lock</span> <span class="keyword">const</span><span class="special">&amp;)</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="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
3531     <span class="keyword">explicit</span> <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
3532
3533     <span class="identifier">unique_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
3534
3535     <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
3536     <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>
3537
3538     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
3539     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
3540
3541     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3542     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
3543     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3544     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
3545
3546     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
3547
3548     <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>
3549     <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>
3550
3551     <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>
3552
3553 <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>
3554     <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">target_time</span><span class="special">);</span>
3555     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">&gt;</span>
3556     <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">&amp;</span> <span class="identifier">relative_time</span><span class="special">);</span>
3557     <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">&amp;</span> <span class="identifier">absolute_time</span><span class="special">);</span>
3558 <span class="preprocessor">#endif</span>
3559
3560 <span class="special">};</span>
3561 </pre>
3562 <p>
3563           <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
3564           <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
3565           for RAII-style locking, it also allows for deferring acquiring the lock
3566           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>
3567           member function is called explicitly, or trying to acquire the lock in
3568           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>
3569           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
3570           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.
3571         </p>
3572 <p>
3573           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
3574           <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3575           <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span><span class="special">&gt;</span></code>),
3576           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
3577           <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3578           <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span></code>),
3579           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
3580           <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3581           <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.
3582         </p>
3583 <p>
3584           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>
3585           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>
3586           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>
3587           returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
3588           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>
3589           returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
3590           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,
3591           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">()-&gt;</span><span class="identifier">unlock</span><span class="special">()</span></code></a>.
3592         </p>
3593 <p>
3594           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.
3595           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
3596           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
3597           thread, and the member functions that release ownership of the lock state
3598           (including the destructor) must be called by the same thread that acquired
3599           ownership of the lock state.
3600         </p>
3601 <div class="section">
3602 <div class="titlepage"><div><div><h5 class="title">
3603 <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>
3604 </h5></div></div></div>
3605 <div class="variablelist">
3606 <p class="title"><b></b></p>
3607 <dl class="variablelist">
3608 <dt><span class="term">Effects:</span></dt>
3609 <dd><p>
3610                   Creates a lock object with no associated mutex.
3611                 </p></dd>
3612 <dt><span class="term">Postcondition:</span></dt>
3613 <dd><p>
3614                   <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>
3615                   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>
3616                   returns <code class="computeroutput"><span class="identifier">NULL</span></code>.
3617                 </p></dd>
3618 <dt><span class="term">Throws:</span></dt>
3619 <dd><p>
3620                   Nothing.
3621                 </p></dd>
3622 </dl>
3623 </div>
3624 </div>
3625 <div class="section">
3626 <div class="titlepage"><div><div><h5 class="title">
3627 <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 &amp; m)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3628           <span class="identifier">m</span><span class="special">)</span></code></a>
3629 </h5></div></div></div>
3630 <div class="variablelist">
3631 <p class="title"><b></b></p>
3632 <dl class="variablelist">
3633 <dt><span class="term">Effects:</span></dt>
3634 <dd><p>
3635                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3636                   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>.
3637                 </p></dd>
3638 <dt><span class="term">Postcondition:</span></dt>
3639 <dd><p>
3640                   <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>
3641                   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>
3642                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3643                 </p></dd>
3644 <dt><span class="term">Throws:</span></dt>
3645 <dd><p>
3646                   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>.
3647                 </p></dd>
3648 </dl>
3649 </div>
3650 </div>
3651 <div class="section">
3652 <div class="titlepage"><div><div><h5 class="title">
3653 <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 &amp; 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">&amp;</span>
3654           <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>
3655 </h5></div></div></div>
3656 <div class="variablelist">
3657 <p class="title"><b></b></p>
3658 <dl class="variablelist">
3659 <dt><span class="term">Precondition:</span></dt>
3660 <dd><p>
3661                   The current thread owns an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
3662                 </p></dd>
3663 <dt><span class="term">Effects:</span></dt>
3664 <dd><p>
3665                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3666                   Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
3667                 </p></dd>
3668 <dt><span class="term">Postcondition:</span></dt>
3669 <dd><p>
3670                   <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>
3671                   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>
3672                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3673                 </p></dd>
3674 <dt><span class="term">Throws:</span></dt>
3675 <dd><p>
3676                   Nothing.
3677                 </p></dd>
3678 </dl>
3679 </div>
3680 </div>
3681 <div class="section">
3682 <div class="titlepage"><div><div><h5 class="title">
3683 <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 &amp; 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">&amp;</span>
3684           <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>
3685 </h5></div></div></div>
3686 <div class="variablelist">
3687 <p class="title"><b></b></p>
3688 <dl class="variablelist">
3689 <dt><span class="term">Effects:</span></dt>
3690 <dd><p>
3691                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3692                 </p></dd>
3693 <dt><span class="term">Postcondition:</span></dt>
3694 <dd><p>
3695                   <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>
3696                   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>
3697                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3698                 </p></dd>
3699 <dt><span class="term">Throws:</span></dt>
3700 <dd><p>
3701                   Nothing.
3702                 </p></dd>
3703 </dl>
3704 </div>
3705 </div>
3706 <div class="section">
3707 <div class="titlepage"><div><div><h5 class="title">
3708 <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 &amp; 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">&amp;</span>
3709           <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>
3710 </h5></div></div></div>
3711 <div class="variablelist">
3712 <p class="title"><b></b></p>
3713 <dl class="variablelist">
3714 <dt><span class="term">Effects:</span></dt>
3715 <dd><p>
3716                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3717                   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>,
3718                   and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3719                 </p></dd>
3720 <dt><span class="term">Postcondition:</span></dt>
3721 <dd><p>
3722                   <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>
3723                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3724                   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>
3725                   returned <code class="computeroutput"><span class="keyword">true</span></code>, then
3726                   <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>
3727                   returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3728                   <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>
3729                   returns <code class="computeroutput"><span class="keyword">false</span></code>.
3730                 </p></dd>
3731 <dt><span class="term">Throws:</span></dt>
3732 <dd><p>
3733                   Nothing.
3734                 </p></dd>
3735 </dl>
3736 </div>
3737 </div>
3738 <div class="section">
3739 <div class="titlepage"><div><div><h5 class="title">
3740 <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&lt;mutex_type&gt;&amp;&amp; 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">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span>
3741           <span class="identifier">sl</span><span class="special">,</span>
3742           <span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a>
3743 </h5></div></div></div>
3744 <div class="variablelist">
3745 <p class="title"><b></b></p>
3746 <dl class="variablelist">
3747 <dt><span class="term">Requires:</span></dt>
3748 <dd><p>
3749                   The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3750                   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>.
3751                 </p></dd>
3752 <dt><span class="term">Effects:</span></dt>
3753 <dd><p>
3754                   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
3755                   and <code class="computeroutput"><span class="identifier">owns</span></code> the ownership
3756                   state. Initializes <code class="computeroutput"><span class="identifier">pm</span></code>
3757                   with nullptr and <code class="computeroutput"><span class="identifier">owns</span></code>
3758                   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>,
3759                   sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3760                   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>,
3761                   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">()-&gt;</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>,
3762                   sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3763                   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>
3764                   to <code class="computeroutput"><span class="keyword">true</span></code>.
3765                 </p></dd>
3766 <dt><span class="term">Note:</span></dt>
3767 <dd><p>
3768                   If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3769                   returns <code class="computeroutput"><span class="keyword">true</span></code> and
3770                   <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&gt;</span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>
3771                   returns <code class="computeroutput"><span class="keyword">false</span></code>, <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3772                 </p></dd>
3773 <dt><span class="term">Throws:</span></dt>
3774 <dd><p>
3775                   Nothing.
3776                 </p></dd>
3777 <dt><span class="term">Notes:</span></dt>
3778 <dd><p>
3779                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
3780                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3781                   is defined on Windows platform
3782                 </p></dd>
3783 </dl>
3784 </div>
3785 </div>
3786 <div class="section">
3787 <div class="titlepage"><div><div><h5 class="title">
3788 <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&lt;mutex_type&gt;&amp;&amp;, const chrono::time_point&lt;Clock, Duration&gt;&amp;)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;,</span>
3789           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;)</span></code></a>
3790 </h5></div></div></div>
3791 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3792 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">sl</span><span class="special">,</span>
3793             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
3794 </pre>
3795 <div class="variablelist">
3796 <p class="title"><b></b></p>
3797 <dl class="variablelist">
3798 <dt><span class="term">Requires:</span></dt>
3799 <dd><p>
3800                   The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3801                   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>.
3802                 </p></dd>
3803 <dt><span class="term">Effects:</span></dt>
3804 <dd><p>
3805                   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
3806                   <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>
3807                   with <code class="computeroutput"><span class="keyword">false</span></code>. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span>
3808                   <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>,
3809                   sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3810                   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>,
3811                   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">()-&gt;</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>,
3812                   sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3813                   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>
3814                   to <code class="computeroutput"><span class="keyword">true</span></code>.
3815                 </p></dd>
3816 <dt><span class="term">Note:</span></dt>
3817 <dd><p>
3818                   If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3819                   returns <code class="computeroutput"><span class="keyword">true</span></code> and
3820                   <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&gt;</span>
3821                   <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>,
3822                   <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3823                 </p></dd>
3824 <dt><span class="term">Throws:</span></dt>
3825 <dd><p>
3826                   Nothing.
3827                 </p></dd>
3828 <dt><span class="term">Notes:</span></dt>
3829 <dd><p>
3830                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
3831                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3832                   is defined on Windows platform
3833                 </p></dd>
3834 </dl>
3835 </div>
3836 </div>
3837 <div class="section">
3838 <div class="titlepage"><div><div><h5 class="title">
3839 <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&lt;mutex_type&gt;&amp;&amp;, const chrono::duration&lt;Rep, Period&gt;&amp;)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;,</span>
3840           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;)</span></code></a>
3841 </h5></div></div></div>
3842 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3843 <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">sl</span><span class="special">,</span>
3844             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span>
3845 </pre>
3846 <div class="variablelist">
3847 <p class="title"><b></b></p>
3848 <dl class="variablelist">
3849 <dt><span class="term">Requires:</span></dt>
3850 <dd><p>
3851                   The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3852                   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>.
3853                 </p></dd>
3854 <dt><span class="term">Effects:</span></dt>
3855 <dd><p>
3856                   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
3857                   <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>
3858                   with <code class="computeroutput"><span class="keyword">false</span></code>. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span>
3859                   <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>,
3860                   sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3861                   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>,
3862                   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">()-&gt;</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>,
3863                   sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3864                   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>
3865                   to <code class="computeroutput"><span class="keyword">true</span></code>.
3866                 </p></dd>
3867 <dt><span class="term">Note:</span></dt>
3868 <dd><p>
3869                   If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3870                   returns <code class="computeroutput"><span class="keyword">true</span></code> and
3871                   <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&gt;</span>
3872                   <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>,
3873                   <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3874                 </p></dd>
3875 <dt><span class="term">Postcondition:</span></dt>
3876 <dd><p>
3877                   .
3878                 </p></dd>
3879 <dt><span class="term">Throws:</span></dt>
3880 <dd><p>
3881                   Nothing.
3882                 </p></dd>
3883 <dt><span class="term">Notes:</span></dt>
3884 <dd><p>
3885                   Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span></code>
3886                   and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3887                   is defined on Windows platform
3888                 </p></dd>
3889 </dl>
3890 </div>
3891 </div>
3892 <div class="section">
3893 <div class="titlepage"><div><div><h5 class="title">
3894 <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 &amp; m,boost::system_time const&amp; abs_time)"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3895           <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">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
3896 </h5></div></div></div>
3897 <div class="variablelist">
3898 <p class="title"><b></b></p>
3899 <dl class="variablelist">
3900 <dt><span class="term">Effects:</span></dt>
3901 <dd><p>
3902                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3903                   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>,
3904                   and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3905                 </p></dd>
3906 <dt><span class="term">Postcondition:</span></dt>
3907 <dd><p>
3908                   <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>
3909                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3910                   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>
3911                   returned <code class="computeroutput"><span class="keyword">true</span></code>, then
3912                   <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>
3913                   returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3914                   <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>
3915                   returns <code class="computeroutput"><span class="keyword">false</span></code>.
3916                 </p></dd>
3917 <dt><span class="term">Throws:</span></dt>
3918 <dd><p>
3919                   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>.
3920                 </p></dd>
3921 </dl>
3922 </div>
3923 </div>
3924 <div class="section">
3925 <div class="titlepage"><div><div><h5 class="title">
3926 <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 &lt;class Clock, class Duration&gt; unique_lock(Lockable &amp; m,const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3927           <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3928           <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
3929 </h5></div></div></div>
3930 <div class="variablelist">
3931 <p class="title"><b></b></p>
3932 <dl class="variablelist">
3933 <dt><span class="term">Effects:</span></dt>
3934 <dd><p>
3935                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3936                   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
3937                   state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3938                 </p></dd>
3939 <dt><span class="term">Postcondition:</span></dt>
3940 <dd><p>
3941                   <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>
3942                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3943                   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
3944                   <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>
3945                   returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3946                   <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>
3947                   returns <code class="computeroutput"><span class="keyword">false</span></code>.
3948                 </p></dd>
3949 <dt><span class="term">Throws:</span></dt>
3950 <dd><p>
3951                   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>.
3952                 </p></dd>
3953 </dl>
3954 </div>
3955 </div>
3956 <div class="section">
3957 <div class="titlepage"><div><div><h5 class="title">
3958 <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 &lt;class Rep, class Period&gt; unique_lock(Lockable &amp; m,const chrono::duration&lt;Rep, Period&gt;&amp; abs_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
3959           <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3960           <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
3961 </h5></div></div></div>
3962 <div class="variablelist">
3963 <p class="title"><b></b></p>
3964 <dl class="variablelist">
3965 <dt><span class="term">Effects:</span></dt>
3966 <dd><p>
3967                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3968                   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>,
3969                   and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3970                 </p></dd>
3971 <dt><span class="term">Postcondition:</span></dt>
3972 <dd><p>
3973                   <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>
3974                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3975                   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
3976                   <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>
3977                   returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3978                   <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>
3979                   returns <code class="computeroutput"><span class="keyword">false</span></code>.
3980                 </p></dd>
3981 <dt><span class="term">Throws:</span></dt>
3982 <dd><p>
3983                   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>.
3984                 </p></dd>
3985 </dl>
3986 </div>
3987 </div>
3988 <div class="section">
3989 <div class="titlepage"><div><div><h5 class="title">
3990 <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>
3991 </h5></div></div></div>
3992 <div class="variablelist">
3993 <p class="title"><b></b></p>
3994 <dl class="variablelist">
3995 <dt><span class="term">Effects:</span></dt>
3996 <dd><p>
3997                   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">-&gt;</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>
3998                   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>
3999                   returns <code class="computeroutput"><span class="keyword">true</span></code>.
4000                 </p></dd>
4001 <dt><span class="term">Throws:</span></dt>
4002 <dd><p>
4003                   Nothing.
4004                 </p></dd>
4005 </dl>
4006 </div>
4007 </div>
4008 <div class="section">
4009 <div class="titlepage"><div><div><h5 class="title">
4010 <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>
4011 </h5></div></div></div>
4012 <div class="variablelist">
4013 <p class="title"><b></b></p>
4014 <dl class="variablelist">
4015 <dt><span class="term">Returns:</span></dt>
4016 <dd><p>
4017                   <code class="computeroutput"><span class="keyword">true</span></code> if the <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4018                   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
4019                   with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
4020                 </p></dd>
4021 <dt><span class="term">Throws:</span></dt>
4022 <dd><p>
4023                   Nothing.
4024                 </p></dd>
4025 </dl>
4026 </div>
4027 </div>
4028 <div class="section">
4029 <div class="titlepage"><div><div><h5 class="title">
4030 <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>
4031 </h5></div></div></div>
4032 <div class="variablelist">
4033 <p class="title"><b></b></p>
4034 <dl class="variablelist">
4035 <dt><span class="term">Returns:</span></dt>
4036 <dd><p>
4037                   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
4038                   with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
4039                   or <code class="computeroutput"><span class="identifier">NULL</span></code> if there
4040                   is no such object.
4041                 </p></dd>
4042 <dt><span class="term">Throws:</span></dt>
4043 <dd><p>
4044                   Nothing.
4045                 </p></dd>
4046 </dl>
4047 </div>
4048 </div>
4049 <div class="section">
4050 <div class="titlepage"><div><div><h5 class="title">
4051 <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>
4052           <span class="keyword">bool</span><span class="special">()</span>
4053           <span class="keyword">const</span></code></a>
4054 </h5></div></div></div>
4055 <div class="variablelist">
4056 <p class="title"><b></b></p>
4057 <dl class="variablelist">
4058 <dt><span class="term">Returns:</span></dt>
4059 <dd><p>
4060                   <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>.
4061                 </p></dd>
4062 <dt><span class="term">Throws:</span></dt>
4063 <dd><p>
4064                   Nothing.
4065                 </p></dd>
4066 </dl>
4067 </div>
4068 </div>
4069 <div class="section">
4070 <div class="titlepage"><div><div><h5 class="title">
4071 <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>
4072 </h5></div></div></div>
4073 <div class="variablelist">
4074 <p class="title"><b></b></p>
4075 <dl class="variablelist">
4076 <dt><span class="term">Effects:</span></dt>
4077 <dd><p>
4078                   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,
4079                   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>
4080                   would have returned <code class="computeroutput"><span class="keyword">true</span></code>,
4081                   it is the responsibility of the calling code to ensure that the
4082                   <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
4083                   unlocked.
4084                 </p></dd>
4085 <dt><span class="term">Returns:</span></dt>
4086 <dd><p>
4087                   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
4088                   with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4089                   at the point of the call, or <code class="computeroutput"><span class="identifier">NULL</span></code>
4090                   if there is no such object.
4091                 </p></dd>
4092 <dt><span class="term">Throws:</span></dt>
4093 <dd><p>
4094                   Nothing.
4095                 </p></dd>
4096 <dt><span class="term">Postcondition:</span></dt>
4097 <dd><p>
4098                   <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4099                   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>
4100                   returns <code class="computeroutput"><span class="identifier">NULL</span></code> and
4101                   <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>
4102                   returns <code class="computeroutput"><span class="keyword">false</span></code>.
4103                 </p></dd>
4104 </dl>
4105 </div>
4106 </div>
4107 </div>
4108 <div class="section">
4109 <div class="titlepage"><div><div><h4 class="title">
4110 <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
4111         <code class="computeroutput"><span class="identifier">shared_lock</span></code> - C++14</a>
4112 </h4></div></div></div>
4113 <div class="toc"><dl class="toc">
4114 <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>
4115 <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">&amp;</span>
4116           <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
4117 <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">&amp;</span>
4118           <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>
4119 <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">&amp;</span>
4120           <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>
4121 <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">&amp;</span>
4122           <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>
4123 <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">&amp;</span>
4124           <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">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
4125 <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>
4126 <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>
4127 <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>
4128 <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>
4129           <span class="keyword">bool</span><span class="special">()</span>
4130           <span class="keyword">const</span></code></a></span></dt>
4131 <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>
4132 </dl></div>
4133 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4134 <span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
4135
4136 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4137 <span class="keyword">class</span> <span class="identifier">shared_lock</span>
4138 <span class="special">{</span>
4139 <span class="keyword">public</span><span class="special">:</span>
4140     <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4141
4142     <span class="comment">// Shared locking</span>
4143     <span class="identifier">shared_lock</span><span class="special">();</span>
4144     <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
4145     <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
4146     <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_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">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span>
4148     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4149     <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
4150     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4151     <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Mutex</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">d</span><span class="special">);</span>
4152     <span class="special">~</span><span class="identifier">shared_lock</span><span class="special">();</span>
4153
4154     <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">shared_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4155     <span class="identifier">shared_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4156
4157     <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4158     <span class="identifier">shared_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4159
4160     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4161     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4162     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4163     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
4164     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4165     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
4166     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4167
4168     <span class="comment">// Conversion from upgrade locking</span>
4169     <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
4170
4171     <span class="comment">// Conversion from exclusive locking</span>
4172     <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4173
4174     <span class="comment">// Setters</span>
4175     <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4176     <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>
4177
4178     <span class="comment">// Getters</span>
4179     <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>
4180     <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4181     <span class="identifier">mutex_type</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4182
4183 <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>
4184     <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">target_time</span><span class="special">);</span>
4185     <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">&amp;</span> <span class="identifier">target_time</span><span class="special">);</span>
4186 <span class="preprocessor">#endif</span>
4187 <span class="special">};</span>
4188 </pre>
4189 <p>
4190           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
4191           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
4192           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.
4193         </p>
4194 <p>
4195           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
4196           provide for RAII-style locking, it also allows for deferring acquiring
4197           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>
4198           member function is called explicitly, or trying to acquire the lock in
4199           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>
4200           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
4201           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.
4202         </p>
4203 <p>
4204           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>
4205           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>
4206           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>
4207           returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
4208           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>
4209           returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
4210           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,
4211           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">()-&gt;</span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>.
4212         </p>
4213 <p>
4214           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.
4215           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
4216           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
4217           thread, and the member functions that release ownership of the lock state
4218           (including the destructor) must be called by the same thread that acquired
4219           ownership of the lock state.
4220         </p>
4221 <div class="section">
4222 <div class="titlepage"><div><div><h5 class="title">
4223 <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>
4224 </h5></div></div></div>
4225 <div class="variablelist">
4226 <p class="title"><b></b></p>
4227 <dl class="variablelist">
4228 <dt><span class="term">Effects:</span></dt>
4229 <dd><p>
4230                   Creates a lock object with no associated mutex.
4231                 </p></dd>
4232 <dt><span class="term">Postcondition:</span></dt>
4233 <dd><p>
4234                   <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>
4235                   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>
4236                   returns <code class="computeroutput"><span class="identifier">NULL</span></code>.
4237                 </p></dd>
4238 <dt><span class="term">Throws:</span></dt>
4239 <dd><p>
4240                   Nothing.
4241                 </p></dd>
4242 </dl>
4243 </div>
4244 </div>
4245 <div class="section">
4246 <div class="titlepage"><div><div><h5 class="title">
4247 <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 &amp; m)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
4248           <span class="identifier">m</span><span class="special">)</span></code></a>
4249 </h5></div></div></div>
4250 <div class="variablelist">
4251 <p class="title"><b></b></p>
4252 <dl class="variablelist">
4253 <dt><span class="term">Effects:</span></dt>
4254 <dd><p>
4255                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4256                   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>.
4257                 </p></dd>
4258 <dt><span class="term">Postcondition:</span></dt>
4259 <dd><p>
4260                   <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>
4261                   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>
4262                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4263                 </p></dd>
4264 <dt><span class="term">Throws:</span></dt>
4265 <dd><p>
4266                   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>.
4267                 </p></dd>
4268 </dl>
4269 </div>
4270 </div>
4271 <div class="section">
4272 <div class="titlepage"><div><div><h5 class="title">
4273 <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 &amp; 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">&amp;</span>
4274           <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>
4275 </h5></div></div></div>
4276 <div class="variablelist">
4277 <p class="title"><b></b></p>
4278 <dl class="variablelist">
4279 <dt><span class="term">Precondition:</span></dt>
4280 <dd><p>
4281                   The current thread owns an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
4282                 </p></dd>
4283 <dt><span class="term">Effects:</span></dt>
4284 <dd><p>
4285                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4286                   Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
4287                 </p></dd>
4288 <dt><span class="term">Postcondition:</span></dt>
4289 <dd><p>
4290                   <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>
4291                   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>
4292                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4293                 </p></dd>
4294 <dt><span class="term">Throws:</span></dt>
4295 <dd><p>
4296                   Nothing.
4297                 </p></dd>
4298 </dl>
4299 </div>
4300 </div>
4301 <div class="section">
4302 <div class="titlepage"><div><div><h5 class="title">
4303 <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 &amp; 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">&amp;</span>
4304           <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>
4305 </h5></div></div></div>
4306 <div class="variablelist">
4307 <p class="title"><b></b></p>
4308 <dl class="variablelist">
4309 <dt><span class="term">Effects:</span></dt>
4310 <dd><p>
4311                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4312                 </p></dd>
4313 <dt><span class="term">Postcondition:</span></dt>
4314 <dd><p>
4315                   <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>
4316                   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>
4317                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4318                 </p></dd>
4319 <dt><span class="term">Throws:</span></dt>
4320 <dd><p>
4321                   Nothing.
4322                 </p></dd>
4323 </dl>
4324 </div>
4325 </div>
4326 <div class="section">
4327 <div class="titlepage"><div><div><h5 class="title">
4328 <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 &amp; 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">&amp;</span>
4329           <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>
4330 </h5></div></div></div>
4331 <div class="variablelist">
4332 <p class="title"><b></b></p>
4333 <dl class="variablelist">
4334 <dt><span class="term">Effects:</span></dt>
4335 <dd><p>
4336                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4337                   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>,
4338                   and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
4339                 </p></dd>
4340 <dt><span class="term">Postcondition:</span></dt>
4341 <dd><p>
4342                   <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>
4343                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4344                   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>
4345                   returned <code class="computeroutput"><span class="keyword">true</span></code>, then
4346                   <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>
4347                   returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
4348                   <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>
4349                   returns <code class="computeroutput"><span class="keyword">false</span></code>.
4350                 </p></dd>
4351 <dt><span class="term">Throws:</span></dt>
4352 <dd><p>
4353                   Nothing.
4354                 </p></dd>
4355 </dl>
4356 </div>
4357 </div>
4358 <div class="section">
4359 <div class="titlepage"><div><div><h5 class="title">
4360 <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 &amp; m,boost::system_time const&amp; abs_time)"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
4361           <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">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
4362 </h5></div></div></div>
4363 <div class="variablelist">
4364 <p class="title"><b></b></p>
4365 <dl class="variablelist">
4366 <dt><span class="term">Effects:</span></dt>
4367 <dd><p>
4368                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4369                   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>,
4370                   and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
4371                 </p></dd>
4372 <dt><span class="term">Postcondition:</span></dt>
4373 <dd><p>
4374                   <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>
4375                   returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4376                   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>
4377                   returned <code class="computeroutput"><span class="keyword">true</span></code>, then
4378                   <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>
4379                   returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
4380                   <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>
4381                   returns <code class="computeroutput"><span class="keyword">false</span></code>.
4382                 </p></dd>
4383 <dt><span class="term">Throws:</span></dt>
4384 <dd><p>
4385                   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>.
4386                 </p></dd>
4387 </dl>
4388 </div>
4389 </div>
4390 <div class="section">
4391 <div class="titlepage"><div><div><h5 class="title">
4392 <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>
4393 </h5></div></div></div>
4394 <div class="variablelist">
4395 <p class="title"><b></b></p>
4396 <dl class="variablelist">
4397 <dt><span class="term">Effects:</span></dt>
4398 <dd><p>
4399                   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">-&gt;</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>
4400                   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>
4401                   returns <code class="computeroutput"><span class="keyword">true</span></code>.
4402                 </p></dd>
4403 <dt><span class="term">Throws:</span></dt>
4404 <dd><p>
4405                   Nothing.
4406                 </p></dd>
4407 </dl>
4408 </div>
4409 </div>
4410 <div class="section">
4411 <div class="titlepage"><div><div><h5 class="title">
4412 <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>
4413 </h5></div></div></div>
4414 <div class="variablelist">
4415 <p class="title"><b></b></p>
4416 <dl class="variablelist">
4417 <dt><span class="term">Returns:</span></dt>
4418 <dd><p>
4419                   <code class="computeroutput"><span class="keyword">true</span></code> if the <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4420                   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
4421                   with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
4422                 </p></dd>
4423 <dt><span class="term">Throws:</span></dt>
4424 <dd><p>
4425                   Nothing.
4426                 </p></dd>
4427 </dl>
4428 </div>
4429 </div>
4430 <div class="section">
4431 <div class="titlepage"><div><div><h5 class="title">
4432 <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>
4433 </h5></div></div></div>
4434 <div class="variablelist">
4435 <p class="title"><b></b></p>
4436 <dl class="variablelist">
4437 <dt><span class="term">Returns:</span></dt>
4438 <dd><p>
4439                   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
4440                   with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
4441                   or <code class="computeroutput"><span class="identifier">NULL</span></code> if there
4442                   is no such object.
4443                 </p></dd>
4444 <dt><span class="term">Throws:</span></dt>
4445 <dd><p>
4446                   Nothing.
4447                 </p></dd>
4448 </dl>
4449 </div>
4450 </div>
4451 <div class="section">
4452 <div class="titlepage"><div><div><h5 class="title">
4453 <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>
4454           <span class="keyword">bool</span><span class="special">()</span>
4455           <span class="keyword">const</span></code></a>
4456 </h5></div></div></div>
4457 <div class="variablelist">
4458 <p class="title"><b></b></p>
4459 <dl class="variablelist">
4460 <dt><span class="term">Returns:</span></dt>
4461 <dd><p>
4462                   <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>.
4463                 </p></dd>
4464 <dt><span class="term">Throws:</span></dt>
4465 <dd><p>
4466                   Nothing.
4467                 </p></dd>
4468 </dl>
4469 </div>
4470 </div>
4471 <div class="section">
4472 <div class="titlepage"><div><div><h5 class="title">
4473 <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>
4474 </h5></div></div></div>
4475 <div class="variablelist">
4476 <p class="title"><b></b></p>
4477 <dl class="variablelist">
4478 <dt><span class="term">Effects:</span></dt>
4479 <dd><p>
4480                   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,
4481                   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>
4482                   would have returned <code class="computeroutput"><span class="keyword">true</span></code>,
4483                   it is the responsibility of the calling code to ensure that the
4484                   <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
4485                   unlocked.
4486                 </p></dd>
4487 <dt><span class="term">Returns:</span></dt>
4488 <dd><p>
4489                   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
4490                   with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4491                   at the point of the call, or <code class="computeroutput"><span class="identifier">NULL</span></code>
4492                   if there is no such object.
4493                 </p></dd>
4494 <dt><span class="term">Throws:</span></dt>
4495 <dd><p>
4496                   Nothing.
4497                 </p></dd>
4498 <dt><span class="term">Postcondition:</span></dt>
4499 <dd><p>
4500                   <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4501                   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>
4502                   returns <code class="computeroutput"><span class="identifier">NULL</span></code> and
4503                   <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>
4504                   returns <code class="computeroutput"><span class="keyword">false</span></code>.
4505                 </p></dd>
4506 </dl>
4507 </div>
4508 </div>
4509 </div>
4510 <div class="section">
4511 <div class="titlepage"><div><div><h4 class="title">
4512 <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
4513         <code class="computeroutput"><span class="identifier">upgrade_lock</span></code> - EXTENSION</a>
4514 </h4></div></div></div>
4515 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4516 <span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
4517
4518 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4519 <span class="keyword">class</span> <span class="identifier">upgrade_lock</span>
4520 <span class="special">{</span>
4521 <span class="keyword">public</span><span class="special">:</span>
4522     <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4523
4524     <span class="comment">// Upgrade locking</span>
4525
4526     <span class="identifier">upgrade_lock</span><span class="special">();</span>
4527     <span class="keyword">explicit</span> <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
4528     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</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>
4529     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">try_to_lock_t</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">&amp;</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span>
4531     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4532     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span>
4533                  <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
4534     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4535     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span>
4536                  <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
4537     <span class="special">~</span><span class="identifier">upgrade_lock</span><span class="special">();</span>
4538
4539     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">upgrade_lock</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4540     <span class="identifier">upgrade_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">upgrade_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4541
4542     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4543     <span class="identifier">upgrade_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4544
4545     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4546     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4547     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4548     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
4549     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4550     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
4551     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4552
4553 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION</span>
4554    <span class="comment">// Conversion from shared locking</span>
4555     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">sl</span><span class="special">,</span> <span class="identifier">try_to_lock_t</span><span class="special">);</span>
4556     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4557     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">sl</span><span class="special">,</span>
4558                    <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
4559     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
4560     <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">sl</span><span class="special">,</span>
4561                    <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
4562 <span class="preprocessor">#endif</span>
4563
4564     <span class="comment">// Conversion from exclusive locking</span>
4565     <span class="keyword">explicit</span> <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4566
4567     <span class="comment">// Setters</span>
4568     <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4569     <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>
4570
4571     <span class="comment">// Getters</span>
4572     <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>
4573     <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4574     <span class="identifier">mutex_type</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4575 <span class="special">};</span>
4576 </pre>
4577 <p>
4578           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
4579           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
4580           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
4581           ownership.
4582         </p>
4583 <p>
4584           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
4585           provide for RAII-style locking, it also allows for deferring acquiring
4586           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>
4587           member function is called explicitly, or trying to acquire the lock in
4588           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>
4589           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
4590           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.
4591         </p>
4592 <p>
4593           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>
4594           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>
4595           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>
4596           returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
4597           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>
4598           returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
4599           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,
4600           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">()-&gt;</span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>.
4601         </p>
4602 <p>
4603           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.
4604           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
4605           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
4606           thread, and the member functions that release ownership of the lock state
4607           (including the destructor) must be called by the same thread that acquired
4608           ownership of the lock state.
4609         </p>
4610 </div>
4611 <div class="section">
4612 <div class="titlepage"><div><div><h4 class="title">
4613 <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
4614         template <code class="computeroutput"><span class="identifier">upgrade_to_unique_lock</span></code>
4615         -- EXTENSION</a>
4616 </h4></div></div></div>
4617 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4618 <span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
4619
4620 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4621 <span class="keyword">class</span> <span class="identifier">upgrade_to_unique_lock</span>
4622 <span class="special">{</span>
4623 <span class="keyword">public</span><span class="special">:</span>
4624     <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4625     <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">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
4626     <span class="special">~</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">();</span>
4627
4628     <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">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4629     <span class="identifier">upgrade_to_unique_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4630
4631     <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4632     <span class="identifier">upgrade_to_unique_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4633
4634     <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">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4635
4636     <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>
4637     <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4638     <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>
4639
4640 <span class="special">};</span>
4641 </pre>
4642 <p>
4643           <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
4644           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.
4645           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
4646           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
4647           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
4648           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
4649           <span class="emphasis"><em>upgrade ownership</em></span>.
4650         </p>
4651 </div>
4652 <div class="section">
4653 <div class="titlepage"><div><div><h4 class="title">
4654 <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
4655         class <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> --
4656         DEPRECATED</a>
4657 </h4></div></div></div>
4658 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span>
4659 <span class="special">{</span>
4660 <span class="keyword">private</span><span class="special">:</span>
4661     <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">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;&amp;</span> <span class="identifier">other</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">&amp;</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">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4663 <span class="keyword">public</span><span class="special">:</span>
4664     <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">();</span>
4665     <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">&amp;</span> <span class="identifier">m</span><span class="special">);</span>
4666     <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">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</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">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_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">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span>
4669
4670     <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">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4671     <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&amp;</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">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4672
4673     <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">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4674
4675     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4676     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4677     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4678
4679     <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>
4680     <span class="identifier">MutexType</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span>
4681
4682     <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>
4683     <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4684 <span class="special">};</span>
4685 </pre>
4686 <p>
4687           The member typedef <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code>
4688           is provided for each distinct <code class="computeroutput"><span class="identifier">MutexType</span></code>
4689           as a typedef to a class with the preceding definition. The semantics of
4690           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">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;</span></code></a>
4691           for the same <code class="computeroutput"><span class="identifier">MutexType</span></code>,
4692           except that the constructor that takes a single reference to a mutex will
4693           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>.
4694         </p>
4695 </div>
4696 </div>
4697 <div class="section">
4698 <div class="titlepage"><div><div><h3 class="title">
4699 <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
4700       - EXTENSION</a>
4701 </h3></div></div></div>
4702 <div class="toc"><dl class="toc">
4703 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks">Strict
4704         Locks</a></span></dt>
4705 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs">Locking
4706         pointers</a></span></dt>
4707 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked">Externally
4708         Locked</a></span></dt>
4709 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard">Class
4710         template <code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a></span></dt>
4711 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock">Class
4712         template <code class="computeroutput"><span class="identifier">reverse_lock</span></code></a></span></dt>
4713 </dl></div>
4714 <div class="section">
4715 <div class="titlepage"><div><div><h4 class="title">
4716 <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
4717         Locks</a>
4718 </h4></div></div></div>
4719 <div class="toc"><dl class="toc">
4720 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock">Class
4721           template <code class="computeroutput"><span class="identifier">strict_lock</span></code></a></span></dt>
4722 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock">Class
4723           template <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a></span></dt>
4724 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_strict_lock">Non
4725           Member Function <code class="computeroutput"><span class="identifier">make_strict_lock</span></code></a></span></dt>
4726 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_nested_strict_lock">Non
4727           Member Function <code class="computeroutput"><span class="identifier">make_nested_strict_lock</span></code></a></span></dt>
4728 </dl></div>
4729 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt; </span>
4730 <span class="comment">// #include &lt;boost/thread/strict_lock.hpp&gt; </span>
4731
4732 <span class="keyword">namespace</span> <span class="identifier">boost</span>
4733 <span class="special">{</span>
4734
4735   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4736   <span class="keyword">class</span> <span class="identifier">strict_lock</span><span class="special">;</span>
4737   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
4738   <span class="keyword">class</span> <span class="identifier">nested_strict_lock</span><span class="special">;</span>
4739   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4740   <span class="keyword">struct</span> <span class="identifier">is_strict_lock_sur_parole</span><span class="special">&lt;</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
4741   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
4742   <span class="keyword">struct</span> <span class="identifier">is_strict_lock_sur_parole</span><span class="special">&lt;</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
4743
4744 <span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_STRICT_LOCK</span>
4745   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4746   <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
4747 <span class="preprocessor">#endif</span>
4748 <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>
4749   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
4750   <span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;</span> <span class="identifier">make_nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
4751 <span class="preprocessor">#endif</span>
4752
4753 <span class="special">}</span>
4754 </pre>
4755 <div class="section">
4756 <div class="titlepage"><div><div><h5 class="title">
4757 <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
4758           template <code class="computeroutput"><span class="identifier">strict_lock</span></code></a>
4759 </h5></div></div></div>
4760 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4761 <span class="comment">// #include &lt;boost/thread/strict_lock.hpp&gt; </span>
4762
4763 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">BasicLockable</span><span class="special">&gt;</span>
4764 <span class="keyword">class</span> <span class="identifier">strict_lock</span>
4765 <span class="special">{</span>
4766 <span class="keyword">public</span><span class="special">:</span>
4767     <span class="keyword">typedef</span> <span class="identifier">BasicLockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4768     <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4769     <span class="identifier">strict_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&amp;</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="keyword">explicit</span> <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
4771     <span class="special">~</span><span class="identifier">strict_lock</span><span class="special">();</span>
4772
4773     <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>
4774 <span class="special">};</span>
4775 </pre>
4776 <p>
4777             <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>.
4778           </p>
4779 <p>
4780             <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
4781             <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
4782             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
4783             as the constructor parameter. On destruction, the ownership is released.
4784             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
4785             exception-safe locking and unlocking.
4786           </p>
4787 <h6>
4788 <a name="thread.synchronization.other_locks.strict_locks.strict_lock.h0"></a>
4789             <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
4790             also <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>
4791           </h6>
4792 <div class="section">
4793 <div class="titlepage"><div><div><h6 class="title">
4794 <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 &amp; m)"><code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
4795             <span class="identifier">m</span><span class="special">)</span></code></a>
4796 </h6></div></div></div>
4797 <div class="variablelist">
4798 <p class="title"><b></b></p>
4799 <dl class="variablelist">
4800 <dt><span class="term">Effects:</span></dt>
4801 <dd><p>
4802                     Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4803                     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>.
4804                   </p></dd>
4805 <dt><span class="term">Throws:</span></dt>
4806 <dd><p>
4807                     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>.
4808                   </p></dd>
4809 </dl>
4810 </div>
4811 </div>
4812 <div class="section">
4813 <div class="titlepage"><div><div><h6 class="title">
4814 <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>
4815 </h6></div></div></div>
4816 <div class="variablelist">
4817 <p class="title"><b></b></p>
4818 <dl class="variablelist">
4819 <dt><span class="term">Effects:</span></dt>
4820 <dd><p>
4821                     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>
4822                     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
4823                     to the constructor.
4824                   </p></dd>
4825 <dt><span class="term">Throws:</span></dt>
4826 <dd><p>
4827                     Nothing.
4828                   </p></dd>
4829 </dl>
4830 </div>
4831 </div>
4832 </div>
4833 <div class="section">
4834 <div class="titlepage"><div><div><h5 class="title">
4835 <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
4836           template <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a>
4837 </h5></div></div></div>
4838 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4839 <span class="comment">// #include &lt;boost/thread/strict_lock.hpp&gt; </span>
4840
4841 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
4842 <span class="keyword">class</span> <span class="identifier">nested_strict_lock</span>
4843 <span class="special">{</span>
4844 <span class="keyword">public</span><span class="special">:</span>
4845     <span class="keyword">typedef</span> <span class="identifier">BasicLockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4846     <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">&amp;</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4847     <span class="identifier">nested_strict_lock</span><span class="special">&amp;</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">&amp;</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="keyword">explicit</span> <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">),</span>
4849     <span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
4850
4851     <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>
4852 <span class="special">};</span>
4853 </pre>
4854 <p>
4855             <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
4856             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>.
4857           </p>
4858 <p>
4859             A nested strict lock is a scoped lock guard ensuring a mutex is locked
4860             on its scope, by taking ownership of an nesting lock, locking the mutex
4861             on construction if not already locked and restoring the ownership to
4862             the nesting lock on destruction.
4863           </p>
4864 <h6>
4865 <a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.h0"></a>
4866             <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
4867             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>
4868           </h6>
4869 <div class="section">
4870 <div class="titlepage"><div><div><h6 class="title">
4871 <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 &amp; lk)"><code class="computeroutput"><span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&amp;</span>
4872             <span class="identifier">lk</span><span class="special">)</span></code></a>
4873 </h6></div></div></div>
4874 <div class="variablelist">
4875 <p class="title"><b></b></p>
4876 <dl class="variablelist">
4877 <dt><span class="term">Requires:</span></dt>
4878 <dd><p>
4879                     <code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()</span>
4880                     <span class="special">!=</span> <span class="identifier">null_ptr</span></code>.
4881                   </p></dd>
4882 <dt><span class="term">Effects:</span></dt>
4883 <dd><p>
4884                     Stores the reference to the lock parameter <code class="computeroutput"><span class="identifier">lk</span></code>
4885                     and takes ownership on it. If the lock doesn't owns the mutex
4886                     lock it.
4887                   </p></dd>
4888 <dt><span class="term">Postcondition:</span></dt>
4889 <dd><p>
4890                     <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>.
4891                   </p></dd>
4892 <dt><span class="term">Throws:</span></dt>
4893 <dd>
4894 <p>
4895                     - lock_error when BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
4896                     is defined and lk.mutex() == null_ptr
4897                   </p>
4898 <p>
4899                     - Any exception that @c lk.lock() can throw.
4900                   </p>
4901 </dd>
4902 </dl>
4903 </div>
4904 </div>
4905 <div class="section">
4906 <div class="titlepage"><div><div><h6 class="title">
4907 <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>
4908 </h6></div></div></div>
4909 <div class="variablelist">
4910 <p class="title"><b></b></p>
4911 <dl class="variablelist">
4912 <dt><span class="term">Effects:</span></dt>
4913 <dd><p>
4914                     Restores ownership to the nesting lock.
4915                   </p></dd>
4916 </dl>
4917 </div>
4918 </div>
4919 <div class="section">
4920 <div class="titlepage"><div><div><h6 class="title">
4921 <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>
4922             <span class="keyword">const</span><span class="special">*</span>
4923             <span class="identifier">l</span><span class="special">)</span>
4924             <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
4925 </h6></div></div></div>
4926 <div class="variablelist">
4927 <p class="title"><b></b></p>
4928 <dl class="variablelist">
4929 <dt><span class="term">Return:</span></dt>
4930 <dd><p>
4931                     Whether if this lock is locking that mutex.
4932                   </p></dd>
4933 </dl>
4934 </div>
4935 </div>
4936 </div>
4937 <div class="section">
4938 <div class="titlepage"><div><div><h5 class="title">
4939 <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
4940           Member Function <code class="computeroutput"><span class="identifier">make_strict_lock</span></code></a>
4941 </h5></div></div></div>
4942 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4943 <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_strict_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
4944 </pre>
4945 <div class="variablelist">
4946 <p class="title"><b></b></p>
4947 <dl class="variablelist">
4948 <dt><span class="term">Returns:</span></dt>
4949 <dd><p>
4950                   a strict_lock as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">}</span></code>.
4951                 </p></dd>
4952 <dt><span class="term">Throws:</span></dt>
4953 <dd><p>
4954                   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>.
4955                 </p></dd>
4956 </dl>
4957 </div>
4958 </div>
4959 <div class="section">
4960 <div class="titlepage"><div><div><h5 class="title">
4961 <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
4962           Member Function <code class="computeroutput"><span class="identifier">make_nested_strict_lock</span></code></a>
4963 </h5></div></div></div>
4964 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
4965 <span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;</span> <span class="identifier">make_nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
4966 </pre>
4967 <div class="variablelist">
4968 <p class="title"><b></b></p>
4969 <dl class="variablelist">
4970 <dt><span class="term">Returns:</span></dt>
4971 <dd><p>
4972                   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>.
4973                 </p></dd>
4974 <dt><span class="term">Throws:</span></dt>
4975 <dd><p>
4976                   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>.
4977                 </p></dd>
4978 </dl>
4979 </div>
4980 </div>
4981 </div>
4982 <div class="section">
4983 <div class="titlepage"><div><div><h4 class="title">
4984 <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
4985         pointers</a>
4986 </h4></div></div></div>
4987 <div class="toc"><dl class="toc">
4988 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr">Class
4989           template <code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span>
4990           </code></a></span></dt>
4991 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr">Class
4992           template <code class="computeroutput"><span class="identifier">strict_lock_ptr</span></code></a></span></dt>
4993 </dl></div>
4994 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/synchroniezd_value.hpp&gt; </span>
4995 <span class="comment">// #include &lt;boost/thread/strict_lock_ptr.hpp&gt; </span>
4996
4997 <span class="keyword">namespace</span> <span class="identifier">boost</span>
4998 <span class="special">{</span>
4999
5000   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
5001   <span class="keyword">class</span> <span class="identifier">strict_lock_ptr</span><span class="special">;</span>
5002   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
5003   <span class="keyword">class</span> <span class="identifier">const_strict_lock_ptr</span><span class="special">;</span>
5004 <span class="special">}</span>
5005 </pre>
5006 <div class="section">
5007 <div class="titlepage"><div><div><h5 class="title">
5008 <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
5009           template <code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span>
5010           </code></a>
5011 </h5></div></div></div>
5012 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/synchroniezd_value.hpp&gt; </span>
5013 <span class="comment">// #include &lt;boost/thread/strict_lock_ptr.hpp&gt; </span>
5014
5015
5016 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
5017 <span class="keyword">class</span> <span class="identifier">const_strict_lock_ptr</span>
5018 <span class="special">{</span>
5019 <span class="keyword">public</span><span class="special">:</span>
5020   <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span>
5021   <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5022
5023   <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">&amp;</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5024   <span class="identifier">const_strict_lock_ptr</span><span class="special">&amp;</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">&amp;</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5025
5026   <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">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
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">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&amp;</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>
5028
5029   <span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">();</span>
5030
5031   <span class="keyword">const</span> <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span><span class="special">;</span>
5032   <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
5033
5034 <span class="special">};</span>
5035 </pre>
5036 <div class="section">
5037 <div class="titlepage"><div><div><h6 class="title">
5038 <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&amp;,Lockable&amp;)"><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">&amp;,</span><span class="identifier">Lockable</span><span class="special">&amp;)</span></code></a>
5039 </h6></div></div></div>
5040 <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">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&amp;</span> <span class="identifier">m</span><span class="special">);</span>
5041 </pre>
5042 <div class="variablelist">
5043 <p class="title"><b></b></p>
5044 <dl class="variablelist">
5045 <dt><span class="term">Effects:</span></dt>
5046 <dd><p>
5047                     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>,
5048                     stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5049                   </p></dd>
5050 <dt><span class="term">Throws:</span></dt>
5051 <dd><p>
5052                     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>.
5053                   </p></dd>
5054 </dl>
5055 </div>
5056 </div>
5057 <div class="section">
5058 <div class="titlepage"><div><div><h6 class="title">
5059 <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&amp;,Lockable&amp;,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">&amp;,</span><span class="identifier">Lockable</span><span class="special">&amp;,</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
5060 </h6></div></div></div>
5061 <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">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&amp;</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>
5062 </pre>
5063 <div class="variablelist">
5064 <p class="title"><b></b></p>
5065 <dl class="variablelist">
5066 <dt><span class="term">Effects:</span></dt>
5067 <dd><p>
5068                     Stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5069                   </p></dd>
5070 <dt><span class="term">Throws:</span></dt>
5071 <dd><p>
5072                     Nothing.
5073                   </p></dd>
5074 </dl>
5075 </div>
5076 </div>
5077 <div class="section">
5078 <div class="titlepage"><div><div><h6 class="title">
5079 <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>
5080 </h6></div></div></div>
5081 <pre class="programlisting"><span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">();</span>
5082 </pre>
5083 <div class="variablelist">
5084 <p class="title"><b></b></p>
5085 <dl class="variablelist">
5086 <dt><span class="term">Effects:</span></dt>
5087 <dd><p>
5088                     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>
5089                     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
5090                     to the constructor.
5091                   </p></dd>
5092 <dt><span class="term">Throws:</span></dt>
5093 <dd><p>
5094                     Nothing.
5095                   </p></dd>
5096 </dl>
5097 </div>
5098 </div>
5099 <div class="section">
5100 <div class="titlepage"><div><div><h6 class="title">
5101 <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-&gt;() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;()</span>
5102             <span class="keyword">const</span></code></a>
5103 </h6></div></div></div>
5104 <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">-&gt;()</span> <span class="keyword">const</span><span class="special">;</span>
5105 </pre>
5106 <div class="variablelist">
5107 <p class="title"><b></b></p>
5108 <dl class="variablelist">
5109 <dt><span class="term">Return:</span></dt>
5110 <dd><p>
5111                     return a constant pointer to the protected value.
5112                   </p></dd>
5113 <dt><span class="term">Throws:</span></dt>
5114 <dd><p>
5115                     Nothing.
5116                   </p></dd>
5117 </dl>
5118 </div>
5119 </div>
5120 <div class="section">
5121 <div class="titlepage"><div><div><h6 class="title">
5122 <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>
5123             <span class="keyword">const</span></code></a>
5124 </h6></div></div></div>
5125 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
5126 </pre>
5127 <div class="variablelist">
5128 <p class="title"><b></b></p>
5129 <dl class="variablelist">
5130 <dt><span class="term">Return:</span></dt>
5131 <dd><p>
5132                     return a constant reference to the protected value.
5133                   </p></dd>
5134 <dt><span class="term">Throws:</span></dt>
5135 <dd><p>
5136                     Nothing.
5137                   </p></dd>
5138 </dl>
5139 </div>
5140 </div>
5141 </div>
5142 <div class="section">
5143 <div class="titlepage"><div><div><h5 class="title">
5144 <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
5145           template <code class="computeroutput"><span class="identifier">strict_lock_ptr</span></code></a>
5146 </h5></div></div></div>
5147 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/synchroniezd_value.hpp&gt; </span>
5148 <span class="comment">// #include &lt;boost/thread/strict_lock_ptr.hpp&gt; </span>
5149
5150 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
5151 <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">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</span>
5152 <span class="special">{</span>
5153 <span class="keyword">public</span><span class="special">:</span>
5154   <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">&amp;</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5155   <span class="identifier">strict_lock_ptr</span><span class="special">&amp;</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">&amp;</span> <span class="identifier">m_</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5156
5157   <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
5158   <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="special">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&amp;</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>
5159   <span class="special">~</span><span class="identifier">strict_lock_ptr</span><span class="special">();</span>
5160
5161   <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;();</span>
5162   <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*();</span>
5163
5164 <span class="special">};</span>
5165 </pre>
5166 <div class="section">
5167 <div class="titlepage"><div><div><h6 class="title">
5168 <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&amp;,Lockable&amp;)"><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">&amp;,</span><span class="identifier">Lockable</span><span class="special">&amp;)</span></code></a>
5169 </h6></div></div></div>
5170 <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">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&amp;</span> <span class="identifier">m</span><span class="special">);</span>
5171 </pre>
5172 <div class="variablelist">
5173 <p class="title"><b></b></p>
5174 <dl class="variablelist">
5175 <dt><span class="term">Effects:</span></dt>
5176 <dd><p>
5177                     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>,
5178                     stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5179                   </p></dd>
5180 <dt><span class="term">Throws:</span></dt>
5181 <dd><p>
5182                     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>.
5183                   </p></dd>
5184 </dl>
5185 </div>
5186 </div>
5187 <div class="section">
5188 <div class="titlepage"><div><div><h6 class="title">
5189 <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&amp;,Lockable&amp;,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">&amp;,</span><span class="identifier">Lockable</span><span class="special">&amp;,</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
5190 </h6></div></div></div>
5191 <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">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">Lockable</span> <span class="special">&amp;</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>
5192 </pre>
5193 <div class="variablelist">
5194 <p class="title"><b></b></p>
5195 <dl class="variablelist">
5196 <dt><span class="term">Effects:</span></dt>
5197 <dd><p>
5198                     Stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5199                   </p></dd>
5200 <dt><span class="term">Throws:</span></dt>
5201 <dd><p>
5202                     Nothing.
5203                   </p></dd>
5204 </dl>
5205 </div>
5206 </div>
5207 <div class="section">
5208 <div class="titlepage"><div><div><h6 class="title">
5209 <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>
5210 </h6></div></div></div>
5211 <pre class="programlisting"><span class="special">~</span> <span class="identifier">strict_lock_ptr</span><span class="special">();</span>
5212 </pre>
5213 <div class="variablelist">
5214 <p class="title"><b></b></p>
5215 <dl class="variablelist">
5216 <dt><span class="term">Effects:</span></dt>
5217 <dd><p>
5218                     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>
5219                     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
5220                     to the constructor.
5221                   </p></dd>
5222 <dt><span class="term">Throws:</span></dt>
5223 <dd><p>
5224                     Nothing.
5225                   </p></dd>
5226 </dl>
5227 </div>
5228 </div>
5229 <div class="section">
5230 <div class="titlepage"><div><div><h6 class="title">
5231 <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-&gt;()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;()</span></code></a>
5232 </h6></div></div></div>
5233 <pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;();</span>
5234 </pre>
5235 <div class="variablelist">
5236 <p class="title"><b></b></p>
5237 <dl class="variablelist">
5238 <dt><span class="term">Return:</span></dt>
5239 <dd><p>
5240                     return a pointer to the protected value.
5241                   </p></dd>
5242 <dt><span class="term">Throws:</span></dt>
5243 <dd><p>
5244                     Nothing.
5245                   </p></dd>
5246 </dl>
5247 </div>
5248 </div>
5249 <div class="section">
5250 <div class="titlepage"><div><div><h6 class="title">
5251 <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>
5252 </h6></div></div></div>
5253 <pre class="programlisting"><span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*();</span>
5254 </pre>
5255 <div class="variablelist">
5256 <p class="title"><b></b></p>
5257 <dl class="variablelist">
5258 <dt><span class="term">Return:</span></dt>
5259 <dd><p>
5260                     return a reference to the protected value.
5261                   </p></dd>
5262 <dt><span class="term">Throws:</span></dt>
5263 <dd><p>
5264                     Nothing.
5265                   </p></dd>
5266 </dl>
5267 </div>
5268 </div>
5269 </div>
5270 </div>
5271 <div class="section">
5272 <div class="titlepage"><div><div><h4 class="title">
5273 <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
5274         Locked</a>
5275 </h4></div></div></div>
5276 <div class="toc"><dl class="toc">
5277 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked">Template
5278           Class <code class="computeroutput"><span class="identifier">externally_locked</span></code></a></span></dt>
5279 <dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref">Template
5280           Class <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span></code></a></span></dt>
5281 <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">&amp;,</span>
5282           <span class="identifier">externally_locked</span><span class="special">&amp;)</span></code></a></span></dt>
5283 </dl></div>
5284 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/externally_locked.hpp&gt;</span>
5285 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
5286 <span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special">;</span>
5287 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
5288 <span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;,</span> <span class="identifier">MutexType</span><span class="special">&gt;;</span>
5289
5290 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
5291 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5292 </pre>
5293 <div class="section">
5294 <div class="titlepage"><div><div><h5 class="title">
5295 <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
5296           Class <code class="computeroutput"><span class="identifier">externally_locked</span></code></a>
5297 </h5></div></div></div>
5298 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/externally_locked.hpp&gt;</span>
5299
5300 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
5301 <span class="keyword">class</span> <span class="identifier">externally_locked</span>
5302 <span class="special">{</span>
5303   <span class="comment">//BOOST_CONCEPT_ASSERT(( CopyConstructible&lt;T&gt; ));</span>
5304   <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span> <span class="identifier">BasicLockable</span><span class="special">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;</span> <span class="special">));</span>
5305
5306 <span class="keyword">public</span><span class="special">:</span>
5307   <span class="keyword">typedef</span> <span class="identifier">MutexType</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5308
5309   <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">obj</span><span class="special">);</span>
5310   <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">,</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">obj</span><span class="special">);</span>
5311   <span class="keyword">explicit</span> <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
5312   <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5313   <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5314   <span class="identifier">externally_locked</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5315   <span class="identifier">externally_locked</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5316
5317   <span class="comment">// observers</span>
5318   <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5319   <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5320
5321   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5322   <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5323   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5324   <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5325
5326   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5327   <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5328   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5329   <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5330
5331  <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>
5332
5333   <span class="comment">// modifiers</span>
5334   <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
5335   <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
5336   <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
5337   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;);</span>
5338 <span class="special">};</span>
5339 </pre>
5340 <p>
5341             <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
5342             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
5343             of type <code class="computeroutput"><span class="identifier">T</span></code>, and actually
5344             provides full access to that object through the get and set member functions,
5345             provided you pass a reference to a strict lock object.
5346           </p>
5347 <p>
5348             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.
5349           </p>
5350 <div class="section">
5351 <div class="titlepage"><div><div><h6 class="title">
5352 <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&amp;, const T&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;,</span>
5353             <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;)</span></code></a>
5354 </h6></div></div></div>
5355 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">obj</span><span class="special">);</span>
5356 </pre>
5357 <div class="variablelist">
5358 <p class="title"><b></b></p>
5359 <dl class="variablelist">
5360 <dt><span class="term">Requires:</span></dt>
5361 <dd><p>
5362                     T is a model of CopyConstructible.
5363                   </p></dd>
5364 <dt><span class="term">Effects:</span></dt>
5365 <dd><p>
5366                     Constructs an externally locked object copying the cloaked type.
5367                   </p></dd>
5368 <dt><span class="term">Throws:</span></dt>
5369 <dd><p>
5370                     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>.
5371                   </p></dd>
5372 </dl>
5373 </div>
5374 </div>
5375 <div class="section">
5376 <div class="titlepage"><div><div><h6 class="title">
5377 <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&amp;, T&amp;&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;,</span>
5378             <span class="identifier">T</span><span class="special">&amp;&amp;)</span></code></a>
5379 </h6></div></div></div>
5380 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">,</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">obj</span><span class="special">);</span>
5381 </pre>
5382 <div class="variablelist">
5383 <p class="title"><b></b></p>
5384 <dl class="variablelist">
5385 <dt><span class="term">Requires:</span></dt>
5386 <dd><p>
5387                     T is a model of Movable.
5388                   </p></dd>
5389 <dt><span class="term">Effects:</span></dt>
5390 <dd><p>
5391                     Constructs an externally locked object by moving the cloaked
5392                     type.
5393                   </p></dd>
5394 <dt><span class="term">Throws:</span></dt>
5395 <dd><p>
5396                     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>.
5397                   </p></dd>
5398 </dl>
5399 </div>
5400 </div>
5401 <div class="section">
5402 <div class="titlepage"><div><div><h6 class="title">
5403 <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&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;)</span></code></a>
5404 </h6></div></div></div>
5405 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
5406 </pre>
5407 <div class="variablelist">
5408 <p class="title"><b></b></p>
5409 <dl class="variablelist">
5410 <dt><span class="term">Requires:</span></dt>
5411 <dd><p>
5412                     T is a model of DefaultConstructible.
5413                   </p></dd>
5414 <dt><span class="term">Effects:</span></dt>
5415 <dd><p>
5416                     Constructs an externally locked object by default constructing
5417                     the cloaked type.
5418                   </p></dd>
5419 <dt><span class="term">Throws:</span></dt>
5420 <dd><p>
5421                     Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">()</span></code>.
5422                   </p></dd>
5423 </dl>
5424 </div>
5425 </div>
5426 <div class="section">
5427 <div class="titlepage"><div><div><h6 class="title">
5428 <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&amp;&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;)</span></code></a>
5429 </h6></div></div></div>
5430 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5431 </pre>
5432 <div class="variablelist">
5433 <p class="title"><b></b></p>
5434 <dl class="variablelist">
5435 <dt><span class="term">Requires:</span></dt>
5436 <dd><p>
5437                     T is a model of Movable.
5438                   </p></dd>
5439 <dt><span class="term">Effects:</span></dt>
5440 <dd><p>
5441                     Move constructs an externally locked object by moving the cloaked
5442                     type and copying the mutex reference
5443                   </p></dd>
5444 <dt><span class="term">Throws:</span></dt>
5445 <dd><p>
5446                     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">&amp;&amp;)</span></code>.
5447                   </p></dd>
5448 </dl>
5449 </div>
5450 </div>
5451 <div class="section">
5452 <div class="titlepage"><div><div><h6 class="title">
5453 <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&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;)</span></code></a>
5454 </h6></div></div></div>
5455 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5456 </pre>
5457 <div class="variablelist">
5458 <p class="title"><b></b></p>
5459 <dl class="variablelist">
5460 <dt><span class="term">Requires:</span></dt>
5461 <dd><p>
5462                     T is a model of Copyable.
5463                   </p></dd>
5464 <dt><span class="term">Effects:</span></dt>
5465 <dd><p>
5466                     Copy constructs an externally locked object by copying the cloaked
5467                     type and copying the mutex reference
5468                   </p></dd>
5469 <dt><span class="term">Throws:</span></dt>
5470 <dd><p>
5471                     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">&amp;)</span></code>.
5472                   </p></dd>
5473 </dl>
5474 </div>
5475 </div>
5476 <div class="section">
5477 <div class="titlepage"><div><div><h6 class="title">
5478 <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&amp;&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;)</span></code></a>
5479 </h6></div></div></div>
5480 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5481 </pre>
5482 <div class="variablelist">
5483 <p class="title"><b></b></p>
5484 <dl class="variablelist">
5485 <dt><span class="term">Requires:</span></dt>
5486 <dd><p>
5487                     T is a model of Movable.
5488                   </p></dd>
5489 <dt><span class="term">Effects:</span></dt>
5490 <dd><p>
5491                     Move assigns an externally locked object by moving the cloaked
5492                     type and copying the mutex reference
5493                   </p></dd>
5494 <dt><span class="term">Throws:</span></dt>
5495 <dd><p>
5496                     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">&amp;&amp;)</span></code>.
5497                   </p></dd>
5498 </dl>
5499 </div>
5500 </div>
5501 <div class="section">
5502 <div class="titlepage"><div><div><h6 class="title">
5503 <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&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;)</span></code></a>
5504 </h6></div></div></div>
5505 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5506 </pre>
5507 <div class="variablelist">
5508 <p class="title"><b></b></p>
5509 <dl class="variablelist">
5510 <dt><span class="term">Requires:</span></dt>
5511 <dd><p>
5512                     T is a model of Copyable.
5513                   </p></dd>
5514 <dt><span class="term">Effects:</span></dt>
5515 <dd><p>
5516                     Copy assigns an externally locked object by copying the cloaked
5517                     type and copying the mutex reference
5518                   </p></dd>
5519 <dt><span class="term">Throws:</span></dt>
5520 <dd><p>
5521                     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">&amp;)</span></code>.
5522                   </p></dd>
5523 </dl>
5524 </div>
5525 </div>
5526 <div class="section">
5527 <div class="titlepage"><div><div><h6 class="title">
5528 <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&lt;mutex_type&gt;&amp;)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;)</span></code></a>
5529 </h6></div></div></div>
5530 <pre class="programlisting"><span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5531 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5532 </pre>
5533 <div class="variablelist">
5534 <p class="title"><b></b></p>
5535 <dl class="variablelist">
5536 <dt><span class="term">Requires:</span></dt>
5537 <dd><p>
5538                     The <code class="computeroutput"><span class="identifier">lk</span></code> parameter
5539                     must be locking the associated mutex.
5540                   </p></dd>
5541 <dt><span class="term">Returns:</span></dt>
5542 <dd><p>
5543                     A reference to the cloaked object
5544                   </p></dd>
5545 <dt><span class="term">Throws:</span></dt>
5546 <dd><p>
5547                     <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5548                     <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5549                     is defined and the run-time preconditions are not satisfied .
5550                   </p></dd>
5551 </dl>
5552 </div>
5553 </div>
5554 <div class="section">
5555 <div class="titlepage"><div><div><h6 class="title">
5556 <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(strict_lock&lt;nested_strict_lock&lt;Lock&gt;&gt;&amp;)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&gt;&amp;)</span></code></a>
5557 </h6></div></div></div>
5558 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5559 <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5560 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5561 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5562 </pre>
5563 <div class="variablelist">
5564 <p class="title"><b></b></p>
5565 <dl class="variablelist">
5566 <dt><span class="term">Requires:</span></dt>
5567 <dd><p>
5568                     <code class="computeroutput"><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">,</span>
5569                     <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">&gt;</span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5570                     parameter must be locking the associated mutex.
5571                   </p></dd>
5572 <dt><span class="term">Returns:</span></dt>
5573 <dd><p>
5574                     A reference to the cloaked object
5575                   </p></dd>
5576 <dt><span class="term">Throws:</span></dt>
5577 <dd><p>
5578                     <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5579                     <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5580                     is defined and the run-time preconditions are not satisfied .
5581                   </p></dd>
5582 </dl>
5583 </div>
5584 </div>
5585 <div class="section">
5586 <div class="titlepage"><div><div><h6 class="title">
5587 <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(strict_lock&lt;nested_strict_lock&lt;Lock&gt;&gt;&amp;)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&gt;&amp;)</span></code></a>
5588 </h6></div></div></div>
5589 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5590 <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5591 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5592 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5593 </pre>
5594 <div class="variablelist">
5595 <p class="title"><b></b></p>
5596 <dl class="variablelist">
5597 <dt><span class="term">Requires:</span></dt>
5598 <dd><p>
5599                     <code class="computeroutput"><span class="identifier">Lock</span></code> is a model
5600                     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">&lt;</span><span class="identifier">mutex_type</span><span class="special">,</span>
5601                     <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">&gt;</span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5602                     parameter must be locking the associated mutex.
5603                   </p></dd>
5604 <dt><span class="term">Returns:</span></dt>
5605 <dd><p>
5606                     A reference to the cloaked object
5607                   </p></dd>
5608 <dt><span class="term">Throws:</span></dt>
5609 <dd><p>
5610                     <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5611                     <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5612                     is defined and the run-time preconditions are not satisfied .
5613                   </p></dd>
5614 </dl>
5615 </div>
5616 </div>
5617 </div>
5618 <div class="section">
5619 <div class="titlepage"><div><div><h5 class="title">
5620 <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&lt;T&amp;&gt;">Template
5621           Class <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span></code></a>
5622 </h5></div></div></div>
5623 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/externally_locked.hpp&gt;</span>
5624
5625 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
5626 <span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;,</span> <span class="identifier">MutexType</span><span class="special">&gt;</span>
5627 <span class="special">{</span>
5628   <span class="comment">//BOOST_CONCEPT_ASSERT(( CopyConstructible&lt;T&gt; ));</span>
5629   <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span> <span class="identifier">BasicLockable</span><span class="special">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;</span> <span class="special">));</span>
5630
5631 <span class="keyword">public</span><span class="special">:</span>
5632   <span class="keyword">typedef</span> <span class="identifier">MutexType</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5633
5634   <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">obj</span><span class="special">);</span>
5635   <span class="keyword">explicit</span> <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
5636   <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5637   <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</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">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&amp;</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">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5640
5641   <span class="comment">// observers</span>
5642   <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5643   <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5644
5645   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5646   <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5647   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5648   <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5649
5650   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5651   <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5652   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5653   <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5654
5655  <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>
5656
5657   <span class="comment">// modifiers</span>
5658   <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
5659   <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
5660   <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
5661   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5662 <span class="special">};</span>
5663 </pre>
5664 <p>
5665             <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
5666             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
5667             of type <code class="computeroutput"><span class="identifier">T</span></code>, and actually
5668             provides full access to that object through the get and set member functions,
5669             provided you pass a reference to a strict lock object.
5670           </p>
5671 <p>
5672             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.
5673           </p>
5674 <div class="section">
5675 <div class="titlepage"><div><div><h6 class="title">
5676 <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&lt;T&amp;&gt;(mutex_type&amp;, T&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;(</span><span class="identifier">mutex_type</span><span class="special">&amp;,</span>
5677             <span class="identifier">T</span><span class="special">&amp;)</span></code></a>
5678 </h6></div></div></div>
5679 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">obj</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5680 </pre>
5681 <div class="variablelist">
5682 <p class="title"><b></b></p>
5683 <dl class="variablelist">
5684 <dt><span class="term">Effects:</span></dt>
5685 <dd><p>
5686                     Constructs an externally locked object copying the cloaked reference.
5687                   </p></dd>
5688 </dl>
5689 </div>
5690 </div>
5691 <div class="section">
5692 <div class="titlepage"><div><div><h6 class="title">
5693 <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&lt;T&amp;&gt;(externally_locked&amp;&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;)</span></code></a>
5694 </h6></div></div></div>
5695 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5696 </pre>
5697 <div class="variablelist">
5698 <p class="title"><b></b></p>
5699 <dl class="variablelist">
5700 <dt><span class="term">Effects:</span></dt>
5701 <dd><p>
5702                     Moves an externally locked object by moving the cloaked type
5703                     and copying the mutex reference
5704                   </p></dd>
5705 </dl>
5706 </div>
5707 </div>
5708 <div class="section">
5709 <div class="titlepage"><div><div><h6 class="title">
5710 <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&amp;&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;)</span></code></a>
5711 </h6></div></div></div>
5712 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5713 </pre>
5714 <div class="variablelist">
5715 <p class="title"><b></b></p>
5716 <dl class="variablelist">
5717 <dt><span class="term">Effects:</span></dt>
5718 <dd><p>
5719                     Move assigns an externally locked object by copying the cloaked
5720                     reference and copying the mutex reference
5721                   </p></dd>
5722 </dl>
5723 </div>
5724 </div>
5725 <div class="section">
5726 <div class="titlepage"><div><div><h6 class="title">
5727 <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&amp;)"><code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;)</span></code></a>
5728 </h6></div></div></div>
5729 <pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5730 </pre>
5731 <div class="variablelist">
5732 <p class="title"><b></b></p>
5733 <dl class="variablelist">
5734 <dt><span class="term">Requires:</span></dt>
5735 <dd><p>
5736                     T is a model of Copyable.
5737                   </p></dd>
5738 <dt><span class="term">Effects:</span></dt>
5739 <dd><p>
5740                     Copy assigns an externally locked object by copying the cloaked
5741                     reference and copying the mutex reference
5742                   </p></dd>
5743 <dt><span class="term">Throws:</span></dt>
5744 <dd><p>
5745                     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">&amp;)</span></code>.
5746                   </p></dd>
5747 </dl>
5748 </div>
5749 </div>
5750 <div class="section">
5751 <div class="titlepage"><div><div><h6 class="title">
5752 <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&lt;mutex_type&gt;&amp;)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;)</span></code></a>
5753 </h6></div></div></div>
5754 <pre class="programlisting"><span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5755 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5756 </pre>
5757 <div class="variablelist">
5758 <p class="title"><b></b></p>
5759 <dl class="variablelist">
5760 <dt><span class="term">Requires:</span></dt>
5761 <dd><p>
5762                     The <code class="computeroutput"><span class="identifier">lk</span></code> parameter
5763                     must be locking the associated mutex.
5764                   </p></dd>
5765 <dt><span class="term">Returns:</span></dt>
5766 <dd><p>
5767                     A reference to the cloaked object
5768                   </p></dd>
5769 <dt><span class="term">Throws:</span></dt>
5770 <dd><p>
5771                     <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5772                     <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5773                     is defined and the run-time preconditions are not satisfied .
5774                   </p></dd>
5775 </dl>
5776 </div>
5777 </div>
5778 <div class="section">
5779 <div class="titlepage"><div><div><h6 class="title">
5780 <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(strict_lock&lt;nested_strict_lock&lt;Lock&gt;&gt;&amp;)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&gt;&amp;)</span></code></a>
5781 </h6></div></div></div>
5782 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5783 <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5784 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5785 <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5786 </pre>
5787 <div class="variablelist">
5788 <p class="title"><b></b></p>
5789 <dl class="variablelist">
5790 <dt><span class="term">Requires:</span></dt>
5791 <dd><p>
5792                     <code class="computeroutput"><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">,</span>
5793                     <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">&gt;</span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5794                     parameter must be locking the associated mutex.
5795                   </p></dd>
5796 <dt><span class="term">Returns:</span></dt>
5797 <dd><p>
5798                     A reference to the cloaked object
5799                   </p></dd>
5800 <dt><span class="term">Throws:</span></dt>
5801 <dd><p>
5802                     <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5803                     <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5804                     is defined and the run-time preconditions are not satisfied .
5805                   </p></dd>
5806 </dl>
5807 </div>
5808 </div>
5809 <div class="section">
5810 <div class="titlepage"><div><div><h6 class="title">
5811 <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(strict_lock&lt;nested_strict_lock&lt;Lock&gt;&gt;&amp;)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">nested_strict_lock</span><span class="special">&lt;</span><span class="identifier">Lock</span><span class="special">&gt;&gt;&amp;)</span></code></a>
5812 </h6></div></div></div>
5813 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5814 <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">);</span>
5815 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5816 <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
5817 </pre>
5818 <div class="variablelist">
5819 <p class="title"><b></b></p>
5820 <dl class="variablelist">
5821 <dt><span class="term">Requires:</span></dt>
5822 <dd><p>
5823                     <code class="computeroutput"><span class="identifier">Lock</span></code> is a model
5824                     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">&lt;</span><span class="identifier">mutex_type</span><span class="special">,</span>
5825                     <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">&gt;</span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5826                     parameter must be locking the associated mutex.
5827                   </p></dd>
5828 <dt><span class="term">Returns:</span></dt>
5829 <dd><p>
5830                     A reference to the cloaked object
5831                   </p></dd>
5832 <dt><span class="term">Throws:</span></dt>
5833 <dd><p>
5834                     <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5835                     <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5836                     is defined and the run-time preconditions are not satisfied .
5837                   </p></dd>
5838 </dl>
5839 </div>
5840 </div>
5841 </div>
5842 <div class="section">
5843 <div class="titlepage"><div><div><h5 class="title">
5844 <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&amp;, externally_locked&amp;)"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;,</span>
5845           <span class="identifier">externally_locked</span><span class="special">&amp;)</span></code></a>
5846 </h5></div></div></div>
5847 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
5848 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">MutexType</span><span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span>
5849 </pre>
5850 </div>
5851 </div>
5852 <div class="section">
5853 <div class="titlepage"><div><div><h4 class="title">
5854 <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
5855         template <code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a>
5856 </h4></div></div></div>
5857 <div class="toc"><dl class="toc">
5858 <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">&amp;</span>
5859           <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
5860 <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">&amp;</span>
5861           <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>
5862 <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>
5863 </dl></div>
5864 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/shared_lock_guard.hpp&gt;</span>
5865 <span class="keyword">namespace</span> <span class="identifier">boost</span>
5866 <span class="special">{</span>
5867   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">SharedLockable</span><span class="special">&gt;</span>
5868   <span class="keyword">class</span> <span class="identifier">shared_lock_guard</span>
5869   <span class="special">{</span>
5870   <span class="keyword">public</span><span class="special">:</span>
5871       <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">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5872       <span class="identifier">shared_lock_guard</span><span class="special">&amp;</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">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5873
5874       <span class="keyword">explicit</span> <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
5875       <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span><span class="special">&amp;</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>
5876
5877       <span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">();</span>
5878   <span class="special">};</span>
5879 <span class="special">}</span>
5880 </pre>
5881 <p>
5882           <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:
5883           on construction it acquires shared ownership of the implementation of the
5884           <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
5885           as the constructor parameter. On destruction, the ownership is released.
5886           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
5887           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">&amp;</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
5888           shared ownership of a lock already held by the current thread.
5889         </p>
5890 <div class="section">
5891 <div class="titlepage"><div><div><h5 class="title">
5892 <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 &amp; m)"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&amp;</span>
5893           <span class="identifier">m</span><span class="special">)</span></code></a>
5894 </h5></div></div></div>
5895 <div class="variablelist">
5896 <p class="title"><b></b></p>
5897 <dl class="variablelist">
5898 <dt><span class="term">Effects:</span></dt>
5899 <dd><p>
5900                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
5901                   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>.
5902                 </p></dd>
5903 <dt><span class="term">Throws:</span></dt>
5904 <dd><p>
5905                   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>.
5906                 </p></dd>
5907 </dl>
5908 </div>
5909 </div>
5910 <div class="section">
5911 <div class="titlepage"><div><div><h5 class="title">
5912 <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 &amp; 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">&amp;</span>
5913           <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>
5914 </h5></div></div></div>
5915 <div class="variablelist">
5916 <p class="title"><b></b></p>
5917 <dl class="variablelist">
5918 <dt><span class="term">Precondition:</span></dt>
5919 <dd><p>
5920                   The current thread owns a lock on <code class="computeroutput"><span class="identifier">m</span></code>
5921                   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>.
5922                 </p></dd>
5923 <dt><span class="term">Effects:</span></dt>
5924 <dd><p>
5925                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
5926                   Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
5927                 </p></dd>
5928 <dt><span class="term">Throws:</span></dt>
5929 <dd><p>
5930                   Nothing.
5931                 </p></dd>
5932 </dl>
5933 </div>
5934 </div>
5935 <div class="section">
5936 <div class="titlepage"><div><div><h5 class="title">
5937 <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>
5938 </h5></div></div></div>
5939 <div class="variablelist">
5940 <p class="title"><b></b></p>
5941 <dl class="variablelist">
5942 <dt><span class="term">Effects:</span></dt>
5943 <dd><p>
5944                   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
5945                   passed to the constructor.
5946                 </p></dd>
5947 <dt><span class="term">Throws:</span></dt>
5948 <dd><p>
5949                   Nothing.
5950                 </p></dd>
5951 </dl>
5952 </div>
5953 </div>
5954 </div>
5955 <div class="section">
5956 <div class="titlepage"><div><div><h4 class="title">
5957 <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
5958         template <code class="computeroutput"><span class="identifier">reverse_lock</span></code></a>
5959 </h4></div></div></div>
5960 <div class="toc"><dl class="toc">
5961 <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">&amp;</span>
5962           <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
5963 <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>
5964 </dl></div>
5965 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/reverse_lock.hpp&gt;</span>
5966 <span class="keyword">namespace</span> <span class="identifier">boost</span>
5967 <span class="special">{</span>
5968
5969   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5970   <span class="keyword">class</span> <span class="identifier">reverse_lock</span>
5971   <span class="special">{</span>
5972   <span class="keyword">public</span><span class="special">:</span>
5973       <span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">reverse_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5974       <span class="identifier">reverse_lock</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">reverse_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5975
5976       <span class="keyword">explicit</span> <span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
5977       <span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">();</span>
5978   <span class="special">};</span>
5979 <span class="special">}</span>
5980 </pre>
5981 <p>
5982           <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
5983           of a lock: it provide for RAII-style, that unlocks the lock at construction
5984           time and lock it at destruction time. In addition, it transfer ownership
5985           temporarily, so that the mutex can not be locked using the Lock.
5986         </p>
5987 <p>
5988           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>
5989           the lock never.
5990         </p>
5991 <div class="section">
5992 <div class="titlepage"><div><div><h5 class="title">
5993 <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 &amp; m)"><code class="computeroutput"><span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&amp;</span>
5994           <span class="identifier">m</span><span class="special">)</span></code></a>
5995 </h5></div></div></div>
5996 <div class="variablelist">
5997 <p class="title"><b></b></p>
5998 <dl class="variablelist">
5999 <dt><span class="term">Effects:</span></dt>
6000 <dd><p>
6001                   Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
6002                   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>
6003                   if <code class="computeroutput"><span class="identifier">m</span></code> owns his lock
6004                   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>.
6005                 </p></dd>
6006 <dt><span class="term">Postcondition:</span></dt>
6007 <dd><p>
6008                   <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">&amp;&amp;</span>
6009                   <span class="identifier">m</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()==</span><span class="number">0</span></code>.
6010                 </p></dd>
6011 <dt><span class="term">Throws:</span></dt>
6012 <dd><p>
6013                   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>.
6014                 </p></dd>
6015 </dl>
6016 </div>
6017 </div>
6018 <div class="section">
6019 <div class="titlepage"><div><div><h5 class="title">
6020 <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>
6021 </h5></div></div></div>
6022 <div class="variablelist">
6023 <p class="title"><b></b></p>
6024 <dl class="variablelist">
6025 <dt><span class="term">Effects:</span></dt>
6026 <dd><p>
6027                   Let be mtx the stored mutex*. If not 0 Invokes <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-&gt;</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>
6028                   and gives again the <code class="computeroutput"><span class="identifier">mtx</span></code>
6029                   to the <code class="computeroutput"><span class="identifier">Lock</span></code> using
6030                   the <code class="computeroutput"><span class="identifier">adopt_lock_t</span></code>
6031                   overload.
6032                 </p></dd>
6033 <dt><span class="term">Throws:</span></dt>
6034 <dd><p>
6035                   Any exception thrown by <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-&gt;</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>.
6036                 </p></dd>
6037 <dt><span class="term">Remarks:</span></dt>
6038 <dd><p>
6039                   Note that if <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-&gt;</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>
6040                   throws an exception while unwinding the program will terminate,
6041                   so don't use reverse_lock if an exception can be thrown.
6042                 </p></dd>
6043 </dl>
6044 </div>
6045 </div>
6046 </div>
6047 </div>
6048 <div class="section">
6049 <div class="titlepage"><div><div><h3 class="title">
6050 <a name="thread.synchronization.lock_functions"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions" title="Lock functions">Lock functions</a>
6051 </h3></div></div></div>
6052 <div class="toc"><dl class="toc">
6053 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.lock_multiple">Non-member
6054         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>
6055 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.lock_range">Non-member
6056         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> //
6057         EXTENSION</a></span></dt>
6058 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.try_lock_multiple">Non-member
6059         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>
6060 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.try_lock_range">Non-member
6061         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> //
6062         EXTENSION</a></span></dt>
6063 </dl></div>
6064 <div class="section">
6065 <div class="titlepage"><div><div><h4 class="title">
6066 <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
6067         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>
6068 </h4></div></div></div>
6069 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
6070 <span class="comment">// #include &lt;boost/thread/lock_algorithms.hpp&gt;</span>
6071 <span class="keyword">namespace</span> <span class="identifier">boost</span>
6072 <span class="special">{</span>
6073
6074   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
6075   <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&amp;</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&amp;</span> <span class="identifier">l2</span><span class="special">);</span>
6076
6077   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
6078   <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&amp;</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&amp;</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&amp;</span> <span class="identifier">l3</span><span class="special">);</span>
6079
6080   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
6081   <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&amp;</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&amp;</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&amp;</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&amp;</span> <span class="identifier">l4</span><span class="special">);</span>
6082
6083   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
6084   <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&amp;</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&amp;</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&amp;</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&amp;</span> <span class="identifier">l4</span><span class="special">,</span><span class="identifier">Lockable5</span><span class="special">&amp;</span> <span class="identifier">l5</span><span class="special">);</span>
6085
6086 <span class="special">}</span>
6087 </pre>
6088 <div class="variablelist">
6089 <p class="title"><b></b></p>
6090 <dl class="variablelist">
6091 <dt><span class="term">Effects:</span></dt>
6092 <dd><p>
6093                 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
6094                 as arguments in an unspecified and indeterminate order in a way that
6095                 avoids deadlock. It is safe to call this function concurrently from
6096                 multiple threads with the same mutexes (or other lockable objects)
6097                 in different orders 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>
6098                 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>
6099                 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
6100                 an exception any locks acquired by the function will be released
6101                 before the function exits.
6102               </p></dd>
6103 <dt><span class="term">Throws:</span></dt>
6104 <dd><p>
6105                 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>
6106                 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>
6107                 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.
6108               </p></dd>
6109 <dt><span class="term">Postcondition:</span></dt>
6110 <dd><p>
6111                 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
6112                 by the calling thread.
6113               </p></dd>
6114 </dl>
6115 </div>
6116 </div>
6117 <div class="section">
6118 <div class="titlepage"><div><div><h4 class="title">
6119 <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
6120         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> //
6121         EXTENSION</a>
6122 </h4></div></div></div>
6123 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">&gt;</span>
6124 <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>
6125 </pre>
6126 <div class="variablelist">
6127 <p class="title"><b></b></p>
6128 <dl class="variablelist">
6129 <dt><span class="term">Preconditions:</span></dt>
6130 <dd><p>
6131                 The <code class="computeroutput"><span class="identifier">value_type</span></code> of
6132                 <code class="computeroutput"><span class="identifier">ForwardIterator</span></code> must
6133                 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>
6134               </p></dd>
6135 <dt><span class="term">Effects:</span></dt>
6136 <dd><p>
6137                 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
6138                 supplied range in an unspecified and indeterminate order in a way
6139                 that avoids deadlock. It is safe to call this function concurrently
6140                 from multiple threads with the same mutexes (or other lockable objects)
6141                 in different orders 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>
6142                 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>
6143                 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
6144                 supplied range throws an exception any locks acquired by the function
6145                 will be released before the function exits.
6146               </p></dd>
6147 <dt><span class="term">Throws:</span></dt>
6148 <dd><p>
6149                 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>
6150                 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>
6151                 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.
6152               </p></dd>
6153 <dt><span class="term">Postcondition:</span></dt>
6154 <dd><p>
6155                 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
6156                 supplied range are locked by the calling thread.
6157               </p></dd>
6158 </dl>
6159 </div>
6160 </div>
6161 <div class="section">
6162 <div class="titlepage"><div><div><h4 class="title">
6163 <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
6164         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>
6165 </h4></div></div></div>
6166 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
6167 <span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&amp;</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&amp;</span> <span class="identifier">l2</span><span class="special">);</span>
6168
6169 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
6170 <span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&amp;</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&amp;</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&amp;</span> <span class="identifier">l3</span><span class="special">);</span>
6171
6172 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
6173 <span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&amp;</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&amp;</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&amp;</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&amp;</span> <span class="identifier">l4</span><span class="special">);</span>
6174
6175 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
6176 <span class="keyword">int</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">&amp;</span> <span class="identifier">l1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">&amp;</span> <span class="identifier">l2</span><span class="special">,</span><span class="identifier">Lockable3</span><span class="special">&amp;</span> <span class="identifier">l3</span><span class="special">,</span><span class="identifier">Lockable4</span><span class="special">&amp;</span> <span class="identifier">l4</span><span class="special">,</span><span class="identifier">Lockable5</span><span class="special">&amp;</span> <span class="identifier">l5</span><span class="special">);</span>
6177 </pre>
6178 <div class="variablelist">
6179 <p class="title"><b></b></p>
6180 <dl class="variablelist">
6181 <dt><span class="term">Effects:</span></dt>
6182 <dd>
6183 <p>
6184                 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>
6185                 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
6186                 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>
6187                 returns <code class="computeroutput"><span class="keyword">false</span></code> then all
6188                 locks acquired are released and the zero-based index of the failed
6189                 lock is returned.
6190               </p>
6191 <p>
6192                 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>
6193                 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
6194                 an exception any locks acquired by the function will be released
6195                 before the function exits.
6196               </p>
6197 </dd>
6198 <dt><span class="term">Returns:</span></dt>
6199 <dd><p>
6200                 <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>
6201                 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
6202                 locked by the calling thread, the zero-based index of the object
6203                 which could not be locked otherwise.
6204               </p></dd>
6205 <dt><span class="term">Throws:</span></dt>
6206 <dd><p>
6207                 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>
6208                 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.
6209               </p></dd>
6210 <dt><span class="term">Postcondition:</span></dt>
6211 <dd><p>
6212                 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
6213                 by the calling thread. Otherwise any locks acquired by this function
6214                 will have been released.
6215               </p></dd>
6216 </dl>
6217 </div>
6218 </div>
6219 <div class="section">
6220 <div class="titlepage"><div><div><h4 class="title">
6221 <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
6222         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> //
6223         EXTENSION</a>
6224 </h4></div></div></div>
6225 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">&gt;</span>
6226 <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>
6227 </pre>
6228 <div class="variablelist">
6229 <p class="title"><b></b></p>
6230 <dl class="variablelist">
6231 <dt><span class="term">Preconditions:</span></dt>
6232 <dd><p>
6233                 The <code class="computeroutput"><span class="identifier">value_type</span></code> of
6234                 <code class="computeroutput"><span class="identifier">ForwardIterator</span></code> must
6235                 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>
6236               </p></dd>
6237 <dt><span class="term">Effects:</span></dt>
6238 <dd>
6239 <p>
6240                 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>
6241                 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
6242                 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>
6243                 returns <code class="computeroutput"><span class="keyword">false</span></code> then all
6244                 locks acquired are released and an iterator referencing the failed
6245                 lock is returned.
6246               </p>
6247 <p>
6248                 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>
6249                 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
6250                 an exception any locks acquired by the function will be released
6251                 before the function exits.
6252               </p>
6253 </dd>
6254 <dt><span class="term">Returns:</span></dt>
6255 <dd><p>
6256                 <code class="computeroutput"><span class="identifier">end</span></code> if all the supplied
6257                 <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
6258                 locked by the calling thread, an iterator referencing the object
6259                 which could not be locked otherwise.
6260               </p></dd>
6261 <dt><span class="term">Throws:</span></dt>
6262 <dd><p>
6263                 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>
6264                 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.
6265               </p></dd>
6266 <dt><span class="term">Postcondition:</span></dt>
6267 <dd><p>
6268                 If the function returns <code class="computeroutput"><span class="identifier">end</span></code>
6269                 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
6270                 supplied range are locked by the calling thread, otherwise all locks
6271                 acquired by the function have been released.
6272               </p></dd>
6273 </dl>
6274 </div>
6275 </div>
6276 </div>
6277 <div class="section">
6278 <div class="titlepage"><div><div><h3 class="title">
6279 <a name="thread.synchronization.lock_factories"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories" title="Lock Factories - EXTENSION">Lock Factories
6280       - EXTENSION</a>
6281 </h3></div></div></div>
6282 <div class="toc"><dl class="toc">
6283 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock">Non
6284         Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;)</span></code></a></span></dt>
6285 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock_t">Non
6286         Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;,</span><span class="identifier">tag</span><span class="special">)</span></code></a></span></dt>
6287 <dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_locks">Non
6288         Member Function <code class="computeroutput"><span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="special">...)</span></code></a></span></dt>
6289 </dl></div>
6290 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span>
6291 <span class="special">{</span>
6292
6293   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6294   <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6295
6296   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6297   <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
6298   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6299   <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
6300   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6301   <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
6302
6303 <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>
6304   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Lockable</span><span class="special">&gt;</span>
6305   <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">...&gt;</span> <span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="special">...</span><span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6306 <span class="preprocessor">#endif</span>
6307 <span class="special">}</span>
6308 </pre>
6309 <div class="section">
6310 <div class="titlepage"><div><div><h4 class="title">
6311 <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&amp;)">Non
6312         Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;)</span></code></a>
6313 </h4></div></div></div>
6314 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6315 <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6316 </pre>
6317 <div class="variablelist">
6318 <p class="title"><b></b></p>
6319 <dl class="variablelist">
6320 <dt><span class="term">Returns:</span></dt>
6321 <dd><p>
6322                 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
6323                 with <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;(</span><span class="identifier">mtx</span><span class="special">)</span></code>.
6324               </p></dd>
6325 <dt><span class="term">Throws:</span></dt>
6326 <dd><p>
6327                 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">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;(</span><span class="identifier">mtx</span><span class="special">)</span></code>.
6328               </p></dd>
6329 </dl>
6330 </div>
6331 </div>
6332 <div class="section">
6333 <div class="titlepage"><div><div><h4 class="title">
6334 <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&amp;,tag)">Non
6335         Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;,</span><span class="identifier">tag</span><span class="special">)</span></code></a>
6336 </h4></div></div></div>
6337 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6338 <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
6339
6340 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6341 <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
6342
6343 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6344 <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</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>
6345 </pre>
6346 <div class="variablelist">
6347 <p class="title"><b></b></p>
6348 <dl class="variablelist">
6349 <dt><span class="term">Returns:</span></dt>
6350 <dd><p>
6351                 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
6352                 with <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;(</span><span class="identifier">mtx</span><span class="special">,</span> <span class="identifier">tag</span><span class="special">)</span></code>.
6353               </p></dd>
6354 <dt><span class="term">Throws:</span></dt>
6355 <dd><p>
6356                 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">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;(</span><span class="identifier">mtx</span><span class="special">,</span>
6357                 <span class="identifier">tag</span><span class="special">)</span></code>.
6358               </p></dd>
6359 </dl>
6360 </div>
6361 </div>
6362 <div class="section">
6363 <div class="titlepage"><div><div><h4 class="title">
6364 <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&amp; ...)">Non
6365         Member Function <code class="computeroutput"><span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="special">...)</span></code></a>
6366 </h4></div></div></div>
6367 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Lockable</span><span class="special">&gt;</span>
6368 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span> <span class="special">...&gt;</span> <span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="special">...</span><span class="identifier">mtx</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
6369 </pre>
6370 <div class="variablelist">
6371 <p class="title"><b></b></p>
6372 <dl class="variablelist">
6373 <dt><span class="term">Effect:</span></dt>
6374 <dd><p>
6375                 Locks all the mutexes.
6376               </p></dd>
6377 <dt><span class="term">Returns:</span></dt>
6378 <dd><p>
6379                 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
6380                 one of the mutex.
6381               </p></dd>
6382 <dt><span class="term">Throws:</span></dt>
6383 <dd><p>
6384                 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>.
6385               </p></dd>
6386 </dl>
6387 </div>
6388 </div>
6389 </div>
6390 <div class="section">
6391 <div class="titlepage"><div><div><h3 class="title">
6392 <a name="thread.synchronization.mutex_types"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types" title="Mutex Types">Mutex Types</a>
6393 </h3></div></div></div>
6394 <div class="toc"><dl class="toc">
6395 <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>
6396 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.try_mutex">Typedef
6397         <code class="computeroutput"><span class="identifier">try_mutex</span></code></a></span></dt>
6398 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.timed_mutex">Class
6399         <code class="computeroutput"><span class="identifier">timed_mutex</span></code></a></span></dt>
6400 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex">Class
6401         <code class="computeroutput"><span class="identifier">recursive_mutex</span></code></a></span></dt>
6402 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex">Typedef
6403         <code class="computeroutput"><span class="identifier">recursive_try_mutex</span></code></a></span></dt>
6404 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex">Class
6405         <code class="computeroutput"><span class="identifier">recursive_timed_mutex</span></code></a></span></dt>
6406 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.shared_mutex">Class
6407         <code class="computeroutput"><span class="identifier">shared_mutex</span></code> -- C++14</a></span></dt>
6408 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.upgrade_mutex">Class
6409         <code class="computeroutput"><span class="identifier">upgrade_mutex</span></code> -- EXTENSION</a></span></dt>
6410 <dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.null_mutex">Class
6411         <code class="computeroutput"><span class="identifier">null_mutex</span></code> -- EXTENSION</a></span></dt>
6412 </dl></div>
6413 <div class="section">
6414 <div class="titlepage"><div><div><h4 class="title">
6415 <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>
6416 </h4></div></div></div>
6417 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.mutex.nativehandle">Member
6418           function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6419 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6420
6421 <span class="keyword">class</span> <span class="identifier">mutex</span><span class="special">:</span>
6422     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6423 <span class="special">{</span>
6424 <span class="keyword">public</span><span class="special">:</span>
6425     <span class="identifier">mutex</span><span class="special">();</span>
6426     <span class="special">~</span><span class="identifier">mutex</span><span class="special">();</span>
6427
6428     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6429     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6430     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6431
6432     <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>
6433     <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6434
6435     <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6436     <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>
6437 <span class="special">};</span>
6438 </pre>
6439 <p>
6440           <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
6441           exclusive-ownership mutex. At most one thread can own the lock on a given
6442           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
6443           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>,
6444           <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>
6445           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>
6446           shall be permitted.
6447         </p>
6448 <div class="section">
6449 <div class="titlepage"><div><div><h5 class="title">
6450 <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
6451           function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6452 </h5></div></div></div>
6453 <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>
6454 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6455 </pre>
6456 <div class="variablelist">
6457 <p class="title"><b></b></p>
6458 <dl class="variablelist">
6459 <dt><span class="term">Effects:</span></dt>
6460 <dd><p>
6461                   Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6462                   that can be used with platform-specific APIs to manipulate the
6463                   underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6464                   and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6465                   are not present.
6466                 </p></dd>
6467 <dt><span class="term">Throws:</span></dt>
6468 <dd><p>
6469                   Nothing.
6470                 </p></dd>
6471 </dl>
6472 </div>
6473 </div>
6474 </div>
6475 <div class="section">
6476 <div class="titlepage"><div><div><h4 class="title">
6477 <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
6478         <code class="computeroutput"><span class="identifier">try_mutex</span></code></a>
6479 </h4></div></div></div>
6480 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6481
6482 <span class="keyword">typedef</span> <span class="identifier">mutex</span> <span class="identifier">try_mutex</span><span class="special">;</span>
6483 </pre>
6484 <p>
6485           <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>
6486           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
6487           compatibility with previous releases of boost.
6488         </p>
6489 </div>
6490 <div class="section">
6491 <div class="titlepage"><div><div><h4 class="title">
6492 <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
6493         <code class="computeroutput"><span class="identifier">timed_mutex</span></code></a>
6494 </h4></div></div></div>
6495 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.timed_mutex.nativehandle">Member
6496           function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6497 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6498
6499 <span class="keyword">class</span> <span class="identifier">timed_mutex</span><span class="special">:</span>
6500     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6501 <span class="special">{</span>
6502 <span class="keyword">public</span><span class="special">:</span>
6503     <span class="identifier">timed_mutex</span><span class="special">();</span>
6504     <span class="special">~</span><span class="identifier">timed_mutex</span><span class="special">();</span>
6505
6506     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6507     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6508     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6509
6510     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6511     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6512     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6513     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
6514
6515     <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>
6516     <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6517
6518     <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">timed_mutex</span><span class="special">&gt;</span> <span class="identifier">scoped_timed_lock</span><span class="special">;</span>
6519     <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>
6520     <span class="keyword">typedef</span> <span class="identifier">scoped_timed_lock</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6521
6522 <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>
6523     <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">&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6524     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">&gt;</span>
6525     <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">&amp;</span> <span class="identifier">relative_time</span><span class="special">);</span>
6526 <span class="preprocessor">#endif</span>
6527
6528 <span class="special">};</span>
6529 </pre>
6530 <p>
6531           <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
6532           an exclusive-ownership mutex. At most one thread can own the lock on a
6533           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
6534           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>,
6535           <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>,
6536           <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>,
6537           <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>
6538           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>
6539           shall be permitted.
6540         </p>
6541 <div class="section">
6542 <div class="titlepage"><div><div><h5 class="title">
6543 <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
6544           function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6545 </h5></div></div></div>
6546 <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>
6547 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6548 </pre>
6549 <div class="variablelist">
6550 <p class="title"><b></b></p>
6551 <dl class="variablelist">
6552 <dt><span class="term">Effects:</span></dt>
6553 <dd><p>
6554                   Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6555                   that can be used with platform-specific APIs to manipulate the
6556                   underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6557                   and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6558                   are not present.
6559                 </p></dd>
6560 <dt><span class="term">Throws:</span></dt>
6561 <dd><p>
6562                   Nothing.
6563                 </p></dd>
6564 </dl>
6565 </div>
6566 </div>
6567 </div>
6568 <div class="section">
6569 <div class="titlepage"><div><div><h4 class="title">
6570 <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
6571         <code class="computeroutput"><span class="identifier">recursive_mutex</span></code></a>
6572 </h4></div></div></div>
6573 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex.nativehandle">Member
6574           function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6575 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6576
6577 <span class="keyword">class</span> <span class="identifier">recursive_mutex</span><span class="special">:</span>
6578     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6579 <span class="special">{</span>
6580 <span class="keyword">public</span><span class="special">:</span>
6581     <span class="identifier">recursive_mutex</span><span class="special">();</span>
6582     <span class="special">~</span><span class="identifier">recursive_mutex</span><span class="special">();</span>
6583
6584     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6585     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
6586     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6587
6588     <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>
6589     <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6590
6591     <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">recursive_mutex</span><span class="special">&gt;</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6592     <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>
6593 <span class="special">};</span>
6594 </pre>
6595 <p>
6596           <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
6597           <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
6598           exclusive-ownership recursive mutex. At most one thread can own the lock
6599           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
6600           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>,
6601           <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>
6602           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>
6603           shall be permitted. A thread that already has exclusive ownership of a
6604           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
6605           <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>
6606           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>
6607           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>
6608           must be called once for each level of ownership acquired by a single thread
6609           before ownership can be acquired by another thread.
6610         </p>
6611 <div class="section">
6612 <div class="titlepage"><div><div><h5 class="title">
6613 <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
6614           function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6615 </h5></div></div></div>
6616 <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>
6617 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6618 </pre>
6619 <div class="variablelist">
6620 <p class="title"><b></b></p>
6621 <dl class="variablelist">
6622 <dt><span class="term">Effects:</span></dt>
6623 <dd><p>
6624                   Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6625                   that can be used with platform-specific APIs to manipulate the
6626                   underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6627                   and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6628                   are not present.
6629                 </p></dd>
6630 <dt><span class="term">Throws:</span></dt>
6631 <dd><p>
6632                   Nothing.
6633                 </p></dd>
6634 </dl>
6635 </div>
6636 </div>
6637 </div>
6638 <div class="section">
6639 <div class="titlepage"><div><div><h4 class="title">
6640 <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
6641         <code class="computeroutput"><span class="identifier">recursive_try_mutex</span></code></a>
6642 </h4></div></div></div>
6643 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6644
6645 <span class="keyword">typedef</span> <span class="identifier">recursive_mutex</span> <span class="identifier">recursive_try_mutex</span><span class="special">;</span>
6646 </pre>
6647 <p>
6648           <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
6649           backwards compatibility with previous releases of boost.
6650         </p>
6651 </div>
6652 <div class="section">
6653 <div class="titlepage"><div><div><h4 class="title">
6654 <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
6655         <code class="computeroutput"><span class="identifier">recursive_timed_mutex</span></code></a>
6656 </h4></div></div></div>
6657 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle">Member
6658           function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6659 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6660
6661 <span class="keyword">class</span> <span class="identifier">recursive_timed_mutex</span><span class="special">:</span>
6662     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6663 <span class="special">{</span>
6664 <span class="keyword">public</span><span class="special">:</span>
6665     <span class="identifier">recursive_timed_mutex</span><span class="special">();</span>
6666     <span class="special">~</span><span class="identifier">recursive_timed_mutex</span><span class="special">();</span>
6667
6668     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6669     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
6670     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6671
6672
6673     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6674     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6675     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6676     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
6677
6678     <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>
6679     <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6680
6681     <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">recursive_timed_mutex</span><span class="special">&gt;</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6682     <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>
6683     <span class="keyword">typedef</span> <span class="identifier">scoped_lock</span> <span class="identifier">scoped_timed_lock</span><span class="special">;</span>
6684
6685 <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>
6686     <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">&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6687     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">TimeDuration</span><span class="special">&gt;</span>
6688     <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">&amp;</span> <span class="identifier">relative_time</span><span class="special">);</span>
6689 <span class="preprocessor">#endif</span>
6690
6691 <span class="special">};</span>
6692 </pre>
6693 <p>
6694           <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
6695           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
6696           an exclusive-ownership recursive mutex. At most one thread can own the
6697           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.
6698           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>,
6699           <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>,
6700           <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>,
6701           <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>
6702           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>
6703           shall be permitted. A thread that already has exclusive ownership of a
6704           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
6705           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>,
6706           <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>,
6707           <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>
6708           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>
6709           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>
6710           must be called once for each level of ownership acquired by a single thread
6711           before ownership can be acquired by another thread.
6712         </p>
6713 <div class="section">
6714 <div class="titlepage"><div><div><h5 class="title">
6715 <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
6716           function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6717 </h5></div></div></div>
6718 <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>
6719 <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6720 </pre>
6721 <div class="variablelist">
6722 <p class="title"><b></b></p>
6723 <dl class="variablelist">
6724 <dt><span class="term">Effects:</span></dt>
6725 <dd><p>
6726                   Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6727                   that can be used with platform-specific APIs to manipulate the
6728                   underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6729                   and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6730                   are not present.
6731                 </p></dd>
6732 <dt><span class="term">Throws:</span></dt>
6733 <dd><p>
6734                   Nothing.
6735                 </p></dd>
6736 </dl>
6737 </div>
6738 </div>
6739 </div>
6740 <div class="section">
6741 <div class="titlepage"><div><div><h4 class="title">
6742 <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
6743         <code class="computeroutput"><span class="identifier">shared_mutex</span></code> -- C++14</a>
6744 </h4></div></div></div>
6745 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6746
6747 <span class="keyword">class</span> <span class="identifier">shared_mutex</span>
6748 <span class="special">{</span>
6749 <span class="keyword">public</span><span class="special">:</span>
6750     <span class="identifier">shared_mutex</span><span class="special">(</span><span class="identifier">shared_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6751     <span class="identifier">shared_mutex</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6752
6753     <span class="identifier">shared_mutex</span><span class="special">();</span>
6754     <span class="special">~</span><span class="identifier">shared_mutex</span><span class="special">();</span>
6755
6756     <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6757     <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6758     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6759     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6760     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6761     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6762     <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6763
6764     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6765     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6766     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6767     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6768     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6769     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6770     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6771
6772 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span>
6773     <span class="comment">// use upgrade_mutex instead.</span>
6774     <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6775     <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6776
6777     <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6778     <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6779     <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6780     <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6781 <span class="preprocessor">#endif</span>
6782
6783 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
6784     <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">&amp;</span> <span class="identifier">timeout</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
6785     <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">&amp;</span> <span class="identifier">timeout</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
6786 <span class="preprocessor">#endif</span>
6787
6788 <span class="special">};</span>
6789 </pre>
6790 <p>
6791           The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_mutex</span></code> provides an implementation
6792           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>.
6793         </p>
6794 <p>
6795           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>,
6796           <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>,
6797           <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>,
6798           <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>,
6799           <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>,
6800           <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>,
6801           <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>,
6802           <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>,
6803           <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>
6804           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>
6805           are permitted.
6806         </p>
6807 <p>
6808           Note the the lack of reader-writer priority policies in shared_mutex. This
6809           is due to an algorithm credited to Alexander Terekhov which lets the OS
6810           decide which thread is the next to get the lock without caring whether
6811           a unique lock or shared lock is being sought. This results in a complete
6812           lack of reader or writer starvation. It is simply fair.
6813         </p>
6814 </div>
6815 <div class="section">
6816 <div class="titlepage"><div><div><h4 class="title">
6817 <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
6818         <code class="computeroutput"><span class="identifier">upgrade_mutex</span></code> -- EXTENSION</a>
6819 </h4></div></div></div>
6820 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6821
6822 <span class="keyword">class</span> <span class="identifier">upgrade_mutex</span>
6823 <span class="special">{</span>
6824 <span class="keyword">public</span><span class="special">:</span>
6825     <span class="identifier">upgrade_mutex</span><span class="special">(</span><span class="identifier">upgrade_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6826     <span class="identifier">upgrade_mutex</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">upgrade_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6827
6828     <span class="identifier">upgrade_mutex</span><span class="special">();</span>
6829     <span class="special">~</span><span class="identifier">upgrade_mutex</span><span class="special">();</span>
6830
6831     <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6832     <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6833     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6834     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6835     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6836     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6837     <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6838
6839     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6840     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6841     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6842     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6843     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6844     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6845     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6846
6847     <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span>
6848     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6849     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6850     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6851     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6852     <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span>
6853
6854     <span class="comment">// Shared &lt;-&gt; Exclusive</span>
6855
6856 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span>
6857     <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock</span><span class="special">();</span>
6858     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6859     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6860     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6861     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6862 <span class="preprocessor">#endif</span>
6863     <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span>
6864
6865     <span class="comment">// Shared &lt;-&gt; Upgrade</span>
6866
6867 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span>
6868     <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">();</span>
6869     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6870     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6871     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6872     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6873 <span class="preprocessor">#endif</span>
6874     <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span>
6875
6876     <span class="comment">// Upgrade &lt;-&gt; Exclusive</span>
6877
6878     <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span>
6879 <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>
6880     <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>
6881     <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">();</span>
6882     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6883     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6884     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6885     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6886 <span class="preprocessor">#endif</span>
6887     <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span>
6888 <span class="special">};</span>
6889 </pre>
6890 <p>
6891           The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_mutex</span></code> provides an implementation
6892           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>.
6893         </p>
6894 <p>
6895           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>,
6896           <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>,
6897           <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>,
6898           <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>,
6899           <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>,
6900           <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>,
6901           <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>,
6902           <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>,
6903           <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>
6904           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>
6905           are permitted.
6906         </p>
6907 </div>
6908 <div class="section">
6909 <div class="titlepage"><div><div><h4 class="title">
6910 <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
6911         <code class="computeroutput"><span class="identifier">null_mutex</span></code> -- EXTENSION</a>
6912 </h4></div></div></div>
6913 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
6914
6915 <span class="keyword">class</span> <span class="identifier">null_mutex</span>
6916 <span class="special">{</span>
6917 <span class="keyword">public</span><span class="special">:</span>
6918     <span class="identifier">null_mutex</span><span class="special">(</span><span class="identifier">null_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6919     <span class="identifier">null_mutex</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">null_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6920
6921     <span class="identifier">null_mutex</span><span class="special">();</span>
6922     <span class="special">~</span><span class="identifier">null_mutex</span><span class="special">();</span>
6923
6924     <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6925     <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6926  <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6927     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6928     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6929     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6930     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6931  <span class="preprocessor">#endif</span>
6932     <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6933
6934     <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6935     <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6936  <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6937     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6938     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6939     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6940     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6941  <span class="preprocessor">#endif</span>
6942     <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6943
6944     <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span>
6945  <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6946     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6947     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6948     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6949     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6950  <span class="preprocessor">#endif</span>
6951     <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span>
6952
6953     <span class="comment">// Shared &lt;-&gt; Exclusive</span>
6954
6955     <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock</span><span class="special">();</span>
6956  <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6957     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6958     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6959     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6960     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6961  <span class="preprocessor">#endif</span>
6962     <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span>
6963
6964     <span class="comment">// Shared &lt;-&gt; Upgrade</span>
6965
6966     <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">();</span>
6967  <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6968     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6969     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6970     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6971     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6972  <span class="preprocessor">#endif</span>
6973     <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span>
6974
6975     <span class="comment">// Upgrade &lt;-&gt; Exclusive</span>
6976
6977     <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span>
6978     <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">();</span>
6979  <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6980     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6981     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
6982     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
6983     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6984  <span class="preprocessor">#endif</span>
6985     <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span>
6986 <span class="special">};</span>
6987 </pre>
6988 <p>
6989           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
6990           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.
6991         </p>
6992 </div>
6993 </div>
6994 <div class="section">
6995 <div class="titlepage"><div><div><h3 class="title">
6996 <a name="thread.synchronization.condvar_ref"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref" title="Condition Variables">Condition Variables</a>
6997 </h3></div></div></div>
6998 <div class="toc"><dl class="toc">
6999 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable">Class
7000         <code class="computeroutput"><span class="identifier">condition_variable</span></code></a></span></dt>
7001 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any">Class
7002         <code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a></span></dt>
7003 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition">Typedef
7004         <code class="computeroutput"><span class="identifier">condition</span></code> DEPRECATED V3</a></span></dt>
7005 <dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.notify_all_at_thread_exit">Non-member
7006         Function <code class="computeroutput"><span class="identifier">notify_all_at_thread_exit</span></code>()</a></span></dt>
7007 </dl></div>
7008 <h5>
7009 <a name="thread.synchronization.condvar_ref.h0"></a>
7010         <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>
7011       </h5>
7012 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span>
7013 <span class="special">{</span>
7014   <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">cv_status</span><span class="special">;</span>
7015   <span class="special">{</span>
7016     <span class="identifier">no_timeout</span><span class="special">,</span>
7017     <span class="identifier">timeout</span>
7018   <span class="special">};</span>
7019   <span class="keyword">class</span> <span class="identifier">condition_variable</span><span class="special">;</span>
7020   <span class="keyword">class</span> <span class="identifier">condition_variable_any</span><span class="special">;</span>
7021   <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">&amp;</span> <span class="identifier">cond</span><span class="special">,</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">lk</span><span class="special">);</span>
7022 <span class="special">}</span>
7023 </pre>
7024 <p>
7025         The classes <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7026         and <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>
7027         provide a mechanism for one thread to wait for notification from another
7028         thread that a particular condition has become true. The general usage pattern
7029         is that one thread locks a mutex and then calls <code class="computeroutput"><span class="identifier">wait</span></code>
7030         on an instance of <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7031         or <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>.
7032         When the thread is woken from the wait, then it checks to see if the appropriate
7033         condition is now true, and continues if so. If the condition is not true,
7034         then the thread then calls <code class="computeroutput"><span class="identifier">wait</span></code>
7035         again to resume waiting. In the simplest case, this condition is just a boolean
7036         variable:
7037       </p>
7038 <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>
7039 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mut</span><span class="special">;</span>
7040 <span class="keyword">bool</span> <span class="identifier">data_ready</span><span class="special">;</span>
7041
7042 <span class="keyword">void</span> <span class="identifier">process_data</span><span class="special">();</span>
7043
7044 <span class="keyword">void</span> <span class="identifier">wait_for_data_to_process</span><span class="special">()</span>
7045 <span class="special">{</span>
7046     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">mut</span><span class="special">);</span>
7047     <span class="keyword">while</span><span class="special">(!</span><span class="identifier">data_ready</span><span class="special">)</span>
7048     <span class="special">{</span>
7049         <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>
7050     <span class="special">}</span>
7051     <span class="identifier">process_data</span><span class="special">();</span>
7052 <span class="special">}</span>
7053 </pre>
7054 <p>
7055         Notice that the <code class="computeroutput"><span class="identifier">lock</span></code> is passed
7056         to <code class="computeroutput"><span class="identifier">wait</span></code>: <code class="computeroutput"><span class="identifier">wait</span></code>
7057         will atomically add the thread to the set of threads waiting on the condition
7058         variable, and unlock the mutex. When the thread is woken, the mutex will
7059         be locked again before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7060         returns. This allows other threads to acquire the mutex in order to update
7061         the shared data, and ensures that the data associated with the condition
7062         is correctly synchronized.
7063       </p>
7064 <p>
7065         In the mean time, another thread sets the condition to <code class="computeroutput"><span class="keyword">true</span></code>,
7066         and then calls either <code class="computeroutput"><span class="identifier">notify_one</span></code>
7067         or <code class="computeroutput"><span class="identifier">notify_all</span></code> on the condition
7068         variable to wake one waiting thread or all the waiting threads respectively.
7069       </p>
7070 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">retrieve_data</span><span class="special">();</span>
7071 <span class="keyword">void</span> <span class="identifier">prepare_data</span><span class="special">();</span>
7072
7073 <span class="keyword">void</span> <span class="identifier">prepare_data_for_processing</span><span class="special">()</span>
7074 <span class="special">{</span>
7075     <span class="identifier">retrieve_data</span><span class="special">();</span>
7076     <span class="identifier">prepare_data</span><span class="special">();</span>
7077     <span class="special">{</span>
7078         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">mut</span><span class="special">);</span>
7079         <span class="identifier">data_ready</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
7080     <span class="special">}</span>
7081     <span class="identifier">cond</span><span class="special">.</span><span class="identifier">notify_one</span><span class="special">();</span>
7082 <span class="special">}</span>
7083 </pre>
7084 <p>
7085         Note that the same mutex is locked before the shared data is updated, but
7086         that the mutex does not have to be locked across the call to <code class="computeroutput"><span class="identifier">notify_one</span></code>.
7087       </p>
7088 <p>
7089         This example uses an object of type <code class="computeroutput"><span class="identifier">condition_variable</span></code>,
7090         but would work just as well with an object of type <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>:
7091         <code class="computeroutput"><span class="identifier">condition_variable_any</span></code> is
7092         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
7093         passed to <code class="computeroutput"><span class="identifier">wait</span></code> is an instance
7094         of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span></code>.
7095         This enables <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7096         to make optimizations in some cases, based on the knowledge of the mutex
7097         type; <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>
7098         typically has a more complex implementation than <code class="computeroutput"><span class="identifier">condition_variable</span></code>.
7099       </p>
7100 <div class="section">
7101 <div class="titlepage"><div><div><h4 class="title">
7102 <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
7103         <code class="computeroutput"><span class="identifier">condition_variable</span></code></a>
7104 </h4></div></div></div>
7105 <div class="toc"><dl class="toc">
7106 <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>
7107 <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>
7108 <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>
7109 <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>
7110 <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</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_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7112           <span class="identifier">lock</span><span class="special">,</span>
7113           <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7114 <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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>
7115           <span class="keyword">const</span><span class="special">&amp;</span>
7116           <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7117 <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7118           <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7119 <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7120           <span class="identifier">lock</span><span class="special">,</span>
7121           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7122           <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7123 <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">&lt;</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">&gt;</span>
7124           <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span>
7125           <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7126 <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">&lt;</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">&gt;</span>
7127           <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span>
7128           <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7129 <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">&lt;</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">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7130           <span class="identifier">lock</span><span class="special">,</span>
7131           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">Predicate</span>
7132           <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7133 <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">&lt;</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">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7134           <span class="identifier">lock</span><span class="special">,</span>
7135           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">,</span> <span class="identifier">Predicate</span>
7136           <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7137 </dl></div>
7138 <pre class="programlisting"><span class="comment">//#include &lt;boost/thread/condition_variable.hpp&gt;</span>
7139
7140 <span class="keyword">namespace</span> <span class="identifier">boost</span>
7141 <span class="special">{</span>
7142     <span class="keyword">class</span> <span class="identifier">condition_variable</span>
7143     <span class="special">{</span>
7144     <span class="keyword">public</span><span class="special">:</span>
7145         <span class="identifier">condition_variable</span><span class="special">();</span>
7146         <span class="special">~</span><span class="identifier">condition_variable</span><span class="special">();</span>
7147
7148         <span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
7149         <span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
7150
7151         <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">);</span>
7152
7153         <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">&gt;</span>
7154         <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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>
7155
7156         <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7157         <span class="keyword">typename</span> <span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">type</span>
7158         <span class="identifier">wait_until</span><span class="special">(</span>
7159             <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7160             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
7161
7162         <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7163         <span class="keyword">bool</span>
7164         <span class="identifier">wait_until</span><span class="special">(</span>
7165             <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7166             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">,</span>
7167             <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7168
7169         <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7170         <span class="keyword">typename</span> <span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">type</span>
7171         <span class="identifier">wait_for</span><span class="special">(</span>
7172             <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7173             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">d</span><span class="special">);</span>
7174
7175         <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7176         <span class="keyword">bool</span>
7177         <span class="identifier">wait_for</span><span class="special">(</span>
7178             <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7179             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">d</span><span class="special">,</span>
7180             <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7181
7182     <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
7183         <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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">&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
7184         <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">&gt;</span>
7185         <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
7186         <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">&gt;</span>
7187         <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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">&amp;</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>
7188         <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
7189         <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&amp;</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>
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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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">&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
7191
7192         <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">&gt;</span>
7193         <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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">&amp;</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>
7194     <span class="preprocessor">#endif</span>
7195
7196     <span class="special">};</span>
7197 <span class="special">}</span>
7198 </pre>
7199 <div class="section">
7200 <div class="titlepage"><div><div><h5 class="title">
7201 <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>
7202 </h5></div></div></div>
7203 <div class="variablelist">
7204 <p class="title"><b></b></p>
7205 <dl class="variablelist">
7206 <dt><span class="term">Effects:</span></dt>
7207 <dd><p>
7208                   Constructs an object of class <code class="computeroutput"><span class="identifier">condition_variable</span></code>.
7209                 </p></dd>
7210 <dt><span class="term">Throws:</span></dt>
7211 <dd><p>
7212                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7213                   occurs.
7214                 </p></dd>
7215 </dl>
7216 </div>
7217 </div>
7218 <div class="section">
7219 <div class="titlepage"><div><div><h5 class="title">
7220 <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>
7221 </h5></div></div></div>
7222 <div class="variablelist">
7223 <p class="title"><b></b></p>
7224 <dl class="variablelist">
7225 <dt><span class="term">Precondition:</span></dt>
7226 <dd><p>
7227                   All threads waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> have been notified by a call
7228                   to <code class="computeroutput"><span class="identifier">notify_one</span></code> or
7229                   <code class="computeroutput"><span class="identifier">notify_all</span></code> (though
7230                   the respective calls to <code class="computeroutput"><span class="identifier">wait</span></code>
7231                   or <code class="computeroutput"><span class="identifier">timed_wait</span></code> need
7232                   not have returned).
7233                 </p></dd>
7234 <dt><span class="term">Effects:</span></dt>
7235 <dd><p>
7236                   Destroys the object.
7237                 </p></dd>
7238 <dt><span class="term">Throws:</span></dt>
7239 <dd><p>
7240                   Nothing.
7241                 </p></dd>
7242 </dl>
7243 </div>
7244 </div>
7245 <div class="section">
7246 <div class="titlepage"><div><div><h5 class="title">
7247 <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>
7248 </h5></div></div></div>
7249 <div class="variablelist">
7250 <p class="title"><b></b></p>
7251 <dl class="variablelist">
7252 <dt><span class="term">Effects:</span></dt>
7253 <dd><p>
7254                   If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7255                   on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7256                   in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7257                   or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7258                   unblocks one of those threads.
7259                 </p></dd>
7260 <dt><span class="term">Throws:</span></dt>
7261 <dd><p>
7262                   Nothing.
7263                 </p></dd>
7264 </dl>
7265 </div>
7266 </div>
7267 <div class="section">
7268 <div class="titlepage"><div><div><h5 class="title">
7269 <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>
7270 </h5></div></div></div>
7271 <div class="variablelist">
7272 <p class="title"><b></b></p>
7273 <dl class="variablelist">
7274 <dt><span class="term">Effects:</span></dt>
7275 <dd><p>
7276                   If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7277                   on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7278                   in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7279                   or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7280                   unblocks all of those threads.
7281                 </p></dd>
7282 <dt><span class="term">Throws:</span></dt>
7283 <dd><p>
7284                   Nothing.
7285                 </p></dd>
7286 </dl>
7287 </div>
7288 </div>
7289 <div class="section">
7290 <div class="titlepage"><div><div><h5 class="title">
7291 <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&lt;boost::mutex&gt;&amp; 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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">)</span></code></a>
7292 </h5></div></div></div>
7293 <div class="variablelist">
7294 <p class="title"><b></b></p>
7295 <dl class="variablelist">
7296 <dt><span class="term">Precondition:</span></dt>
7297 <dd><p>
7298                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7299                   by the current thread, and either no other thread is currently
7300                   waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7301                   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
7302                   calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7303                   <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7304                   the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7305                   as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7306                   for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7307                 </p></dd>
7308 <dt><span class="term">Effects:</span></dt>
7309 <dd><p>
7310                   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.
7311                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7312                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7313                   or spuriously. When the thread is unblocked (for whatever reason),
7314                   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
7315                   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
7316                   exception.
7317                 </p></dd>
7318 <dt><span class="term">Postcondition:</span></dt>
7319 <dd><p>
7320                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7321                   by the current thread.
7322                 </p></dd>
7323 <dt><span class="term">Throws:</span></dt>
7324 <dd><p>
7325                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7326                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7327                   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>
7328                   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
7329                   with the current thread of execution.
7330                 </p></dd>
7331 </dl>
7332 </div>
7333 </div>
7334 <div class="section">
7335 <div class="titlepage"><div><div><h5 class="title">
7336 <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&lt;typename predicate_type&gt; void wait(boost::unique_lock&lt;boost::mutex&gt;&amp; lock, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7337           <span class="identifier">lock</span><span class="special">,</span>
7338           <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
7339 </h5></div></div></div>
7340 <div class="variablelist">
7341 <p class="title"><b></b></p>
7342 <dl class="variablelist">
7343 <dt><span class="term">Effects:</span></dt>
7344 <dd>
7345 <p>
7346                   As-if
7347 </p>
7348 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7349 <span class="special">{</span>
7350     <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
7351 <span class="special">}</span>
7352 </pre>
7353 <p>
7354                 </p>
7355 </dd>
7356 </dl>
7357 </div>
7358 </div>
7359 <div class="section">
7360 <div class="titlepage"><div><div><h5 class="title">
7361 <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&lt;boost::mutex&gt;&amp; lock,boost::system_time const&amp; 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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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>
7362           <span class="keyword">const</span><span class="special">&amp;</span>
7363           <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7364 </h5></div></div></div>
7365 <div class="variablelist">
7366 <p class="title"><b></b></p>
7367 <dl class="variablelist">
7368 <dt><span class="term">Precondition:</span></dt>
7369 <dd><p>
7370                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7371                   by the current thread, and either no other thread is currently
7372                   waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7373                   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
7374                   calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7375                   <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7376                   the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7377                   as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7378                   for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7379                 </p></dd>
7380 <dt><span class="term">Effects:</span></dt>
7381 <dd><p>
7382                   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.
7383                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7384                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7385                   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
7386                   the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7387                   or spuriously. When the thread is unblocked (for whatever reason),
7388                   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
7389                   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
7390                   exception.
7391                 </p></dd>
7392 <dt><span class="term">Returns:</span></dt>
7393 <dd><p>
7394                   <code class="computeroutput"><span class="keyword">false</span></code> if the call
7395                   is returning because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7396                   was reached, <code class="computeroutput"><span class="keyword">true</span></code>
7397                   otherwise.
7398                 </p></dd>
7399 <dt><span class="term">Postcondition:</span></dt>
7400 <dd><p>
7401                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7402                   by the current thread.
7403                 </p></dd>
7404 <dt><span class="term">Throws:</span></dt>
7405 <dd><p>
7406                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7407                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7408                   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>
7409                   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
7410                   with the current thread of execution.
7411                 </p></dd>
7412 </dl>
7413 </div>
7414 </div>
7415 <div class="section">
7416 <div class="titlepage"><div><div><h5 class="title">
7417 <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&lt;typename duration_type&gt; bool timed_wait(boost::unique_lock&lt;boost::mutex&gt;&amp; lock,duration_type const&amp; rel_time)"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">duration_type</span><span class="special">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7418           <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a>
7419 </h5></div></div></div>
7420 <div class="variablelist">
7421 <p class="title"><b></b></p>
7422 <dl class="variablelist">
7423 <dt><span class="term">Precondition:</span></dt>
7424 <dd><p>
7425                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7426                   by the current thread, and either no other thread is currently
7427                   waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7428                   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
7429                   calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7430                   <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7431                   the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7432                   as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7433                   for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7434                 </p></dd>
7435 <dt><span class="term">Effects:</span></dt>
7436 <dd><p>
7437                   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.
7438                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7439                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7440                   after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7441                   argument has elapsed, or spuriously. When the thread is unblocked
7442                   (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>
7443                   before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7444                   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>
7445                   if the function exits with an exception.
7446                 </p></dd>
7447 <dt><span class="term">Returns:</span></dt>
7448 <dd><p>
7449                   <code class="computeroutput"><span class="keyword">false</span></code> if the call
7450                   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.
7451                 </p></dd>
7452 <dt><span class="term">Postcondition:</span></dt>
7453 <dd><p>
7454                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7455                   by the current thread.
7456                 </p></dd>
7457 <dt><span class="term">Throws:</span></dt>
7458 <dd><p>
7459                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7460                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7461                   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>
7462                   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
7463                   with the current thread of execution.
7464                 </p></dd>
7465 </dl>
7466 </div>
7467 <div class="note"><table border="0" summary="Note">
7468 <tr>
7469 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
7470 <th align="left">Note</th>
7471 </tr>
7472 <tr><td align="left" valign="top"><p>
7473               The duration overload of timed_wait is difficult to use correctly.
7474               The overload taking a predicate should be preferred in most cases.
7475             </p></td></tr>
7476 </table></div>
7477 </div>
7478 <div class="section">
7479 <div class="titlepage"><div><div><h5 class="title">
7480 <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&lt;typename predicate_type&gt; bool timed_wait(boost::unique_lock&lt;boost::mutex&gt;&amp; lock, boost::system_time const&amp; abs_time, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">predicate_type</span><span class="special">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7481           <span class="identifier">lock</span><span class="special">,</span>
7482           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7483           <span class="identifier">pred</span><span class="special">)</span></code></a>
7484 </h5></div></div></div>
7485 <div class="variablelist">
7486 <p class="title"><b></b></p>
7487 <dl class="variablelist">
7488 <dt><span class="term">Effects:</span></dt>
7489 <dd>
7490 <p>
7491                   As-if
7492 </p>
7493 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7494 <span class="special">{</span>
7495     <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>
7496     <span class="special">{</span>
7497         <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
7498     <span class="special">}</span>
7499 <span class="special">}</span>
7500 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
7501 </pre>
7502 <p>
7503                 </p>
7504 </dd>
7505 </dl>
7506 </div>
7507 </div>
7508 <div class="section">
7509 <div class="titlepage"><div><div><h5 class="title">
7510 <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 &lt;class Clock, class Duration&gt; cv_status wait_until(boost::unique_lock&lt;boost::mutex&gt;&amp; lock, const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7511           <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span>
7512           <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7513 </h5></div></div></div>
7514 <div class="variablelist">
7515 <p class="title"><b></b></p>
7516 <dl class="variablelist">
7517 <dt><span class="term">Precondition:</span></dt>
7518 <dd><p>
7519                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7520                   by the current thread, and either no other thread is currently
7521                   waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7522                   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
7523                   calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7524                   <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
7525                   currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7526                   as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7527                   for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7528                 </p></dd>
7529 <dt><span class="term">Effects:</span></dt>
7530 <dd><p>
7531                   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.
7532                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7533                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7534                   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
7535                   the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7536                   or spuriously. When the thread is unblocked (for whatever reason),
7537                   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
7538                   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
7539                   exception.
7540                 </p></dd>
7541 <dt><span class="term">Returns:</span></dt>
7542 <dd><p>
7543                   <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
7544                   because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7545                   was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
7546                   otherwise.
7547                 </p></dd>
7548 <dt><span class="term">Postcondition:</span></dt>
7549 <dd><p>
7550                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7551                   by the current thread.
7552                 </p></dd>
7553 <dt><span class="term">Throws:</span></dt>
7554 <dd><p>
7555                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7556                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7557                   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>
7558                   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
7559                   with the current thread of execution.
7560                 </p></dd>
7561 </dl>
7562 </div>
7563 </div>
7564 <div class="section">
7565 <div class="titlepage"><div><div><h5 class="title">
7566 <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 &lt;class Rep, class Period&gt; cv_status wait_for(boost::unique_lock&lt;boost::mutex&gt;&amp; lock, const chrono::duration&lt;Rep, Period&gt;&amp; rel_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7567           <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span>
7568           <span class="identifier">rel_time</span><span class="special">)</span></code></a>
7569 </h5></div></div></div>
7570 <div class="variablelist">
7571 <p class="title"><b></b></p>
7572 <dl class="variablelist">
7573 <dt><span class="term">Precondition:</span></dt>
7574 <dd><p>
7575                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7576                   by the current thread, and either no other thread is currently
7577                   waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7578                   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
7579                   calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7580                   <code class="computeroutput"><span class="identifier">wait_until</span></code> or
7581                   <code class="computeroutput"><span class="identifier">wait_for</span></code> in all
7582                   the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7583                   as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7584                   for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7585                 </p></dd>
7586 <dt><span class="term">Effects:</span></dt>
7587 <dd><p>
7588                   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.
7589                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7590                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7591                   after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7592                   argument has elapsed, or spuriously. When the thread is unblocked
7593                   (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>
7594                   before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7595                   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>
7596                   if the function exits with an exception.
7597                 </p></dd>
7598 <dt><span class="term">Returns:</span></dt>
7599 <dd><p>
7600                   <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span> </code> if the call is returning
7601                   because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
7602                   has elapsed, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span>
7603                   </code> otherwise.
7604                 </p></dd>
7605 <dt><span class="term">Postcondition:</span></dt>
7606 <dd><p>
7607                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7608                   by the current thread.
7609                 </p></dd>
7610 <dt><span class="term">Throws:</span></dt>
7611 <dd><p>
7612                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7613                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7614                   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>
7615                   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
7616                   with the current thread of execution.
7617                 </p></dd>
7618 </dl>
7619 </div>
7620 <div class="note"><table border="0" summary="Note">
7621 <tr>
7622 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
7623 <th align="left">Note</th>
7624 </tr>
7625 <tr><td align="left" valign="top"><p>
7626               The duration overload of timed_wait is difficult to use correctly.
7627               The overload taking a predicate should be preferred in most cases.
7628             </p></td></tr>
7629 </table></div>
7630 </div>
7631 <div class="section">
7632 <div class="titlepage"><div><div><h5 class="title">
7633 <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 &lt;class Clock, class Duration, class Predicate&gt; bool wait_until(boost::unique_lock&lt;boost::mutex&gt;&amp; lock, const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7634           <span class="identifier">lock</span><span class="special">,</span>
7635           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">Predicate</span>
7636           <span class="identifier">pred</span><span class="special">)</span></code></a>
7637 </h5></div></div></div>
7638 <div class="variablelist">
7639 <p class="title"><b></b></p>
7640 <dl class="variablelist">
7641 <dt><span class="term">Effects:</span></dt>
7642 <dd>
7643 <p>
7644                   As-if
7645 </p>
7646 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7647 <span class="special">{</span>
7648     <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>
7649     <span class="special">{</span>
7650         <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
7651     <span class="special">}</span>
7652 <span class="special">}</span>
7653 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
7654 </pre>
7655 <p>
7656                 </p>
7657 </dd>
7658 </dl>
7659 </div>
7660 </div>
7661 <div class="section">
7662 <div class="titlepage"><div><div><h5 class="title">
7663 <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 &lt;class Rep, class Period, class Predicate&gt; bool wait_for(boost::unique_lock&lt;boost::mutex&gt;&amp; lock, const chrono::duration&lt;Rep, Period&gt;&amp; rel_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span>
7664           <span class="identifier">lock</span><span class="special">,</span>
7665           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">,</span> <span class="identifier">Predicate</span>
7666           <span class="identifier">pred</span><span class="special">)</span></code></a>
7667 </h5></div></div></div>
7668 <div class="variablelist">
7669 <p class="title"><b></b></p>
7670 <dl class="variablelist">
7671 <dt><span class="term">Effects:</span></dt>
7672 <dd>
7673 <p>
7674                   As-if
7675 </p>
7676 <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>
7677 </pre>
7678 <p>
7679                 </p>
7680 </dd>
7681 </dl>
7682 </div>
7683 </div>
7684 </div>
7685 <div class="section">
7686 <div class="titlepage"><div><div><h4 class="title">
7687 <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
7688         <code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a>
7689 </h4></div></div></div>
7690 <div class="toc"><dl class="toc">
7691 <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>
7692 <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>
7693 <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>
7694 <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>
7695 <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
7696           <span class="identifier">lock</span><span class="special">)</span></code></a></span></dt>
7697 <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">&lt;</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">&gt;</span>
7698           <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7699           <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7700 <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</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">&amp;</span>
7701           <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">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7702 <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">&lt;</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">&gt;</span>
7703           <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span>
7704           <span class="keyword">const</span><span class="special">&amp;</span>
7705           <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7706 <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">&lt;</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">&gt;</span>
7707           <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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>
7708           <span class="keyword">const</span><span class="special">&amp;</span>
7709           <span class="identifier">abs_time</span><span class="special">,</span>
7710           <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7711 <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">&lt;</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">&gt;</span> <span class="identifier">cv_status</span>
7712           <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
7713           <span class="identifier">lock</span><span class="special">,</span>
7714           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7715 <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">&lt;</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">&gt;</span> <span class="identifier">cv_status</span>
7716           <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
7717           <span class="identifier">lock</span><span class="special">,</span>
7718           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7719 <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">&lt;</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">&gt;</span>
7720           <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span>
7721           <span class="identifier">abs_time</span><span class="special">,</span>
7722           <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7723 <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">&lt;</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">&gt;</span>
7724           <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span>
7725           <span class="identifier">rel_time</span><span class="special">,</span>
7726           <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7727 </dl></div>
7728 <pre class="programlisting"><span class="comment">//#include &lt;boost/thread/condition_variable.hpp&gt;</span>
7729
7730 <span class="keyword">namespace</span> <span class="identifier">boost</span>
7731 <span class="special">{</span>
7732     <span class="keyword">class</span> <span class="identifier">condition_variable_any</span>
7733     <span class="special">{</span>
7734     <span class="keyword">public</span><span class="special">:</span>
7735         <span class="identifier">condition_variable_any</span><span class="special">();</span>
7736         <span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">();</span>
7737
7738         <span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">();</span>
7739         <span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">();</span>
7740
7741         <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</span>
7742         <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">);</span>
7743
7744         <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
7745         <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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>
7746
7747         <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7748         <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span>
7749             <span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7750             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">);</span>
7751
7752         <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7753         <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span>
7754             <span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7755             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">t</span><span class="special">,</span>
7756             <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7757
7758
7759         <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7760         <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span>
7761             <span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7762             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">d</span><span class="special">);</span>
7763
7764         <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
7765         <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span>
7766             <span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7767             <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">d</span><span class="special">,</span>
7768             <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7769
7770     <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
7771         <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</span>
7772         <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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">&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
7773         <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
7774         <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
7775         <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
7776         <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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">&amp;</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>
7777         <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
7778         <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span> <span class="keyword">const</span><span class="special">&amp;</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>
7779         <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</span>
7780         <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&gt;&amp;</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">&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
7781         <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
7782         <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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">&amp;</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>
7783     <span class="preprocessor">#endif</span>
7784     <span class="special">};</span>
7785 <span class="special">}</span>
7786 </pre>
7787 <div class="section">
7788 <div class="titlepage"><div><div><h5 class="title">
7789 <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>
7790 </h5></div></div></div>
7791 <div class="variablelist">
7792 <p class="title"><b></b></p>
7793 <dl class="variablelist">
7794 <dt><span class="term">Effects:</span></dt>
7795 <dd><p>
7796                   Constructs an object of class <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>.
7797                 </p></dd>
7798 <dt><span class="term">Throws:</span></dt>
7799 <dd><p>
7800                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7801                   occurs.
7802                 </p></dd>
7803 </dl>
7804 </div>
7805 </div>
7806 <div class="section">
7807 <div class="titlepage"><div><div><h5 class="title">
7808 <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>
7809 </h5></div></div></div>
7810 <div class="variablelist">
7811 <p class="title"><b></b></p>
7812 <dl class="variablelist">
7813 <dt><span class="term">Precondition:</span></dt>
7814 <dd><p>
7815                   All threads waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> have been notified by a call
7816                   to <code class="computeroutput"><span class="identifier">notify_one</span></code> or
7817                   <code class="computeroutput"><span class="identifier">notify_all</span></code> (though
7818                   the respective calls to <code class="computeroutput"><span class="identifier">wait</span></code>
7819                   or <code class="computeroutput"><span class="identifier">timed_wait</span></code> need
7820                   not have returned).
7821                 </p></dd>
7822 <dt><span class="term">Effects:</span></dt>
7823 <dd><p>
7824                   Destroys the object.
7825                 </p></dd>
7826 <dt><span class="term">Throws:</span></dt>
7827 <dd><p>
7828                   Nothing.
7829                 </p></dd>
7830 </dl>
7831 </div>
7832 </div>
7833 <div class="section">
7834 <div class="titlepage"><div><div><h5 class="title">
7835 <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>
7836 </h5></div></div></div>
7837 <div class="variablelist">
7838 <p class="title"><b></b></p>
7839 <dl class="variablelist">
7840 <dt><span class="term">Effects:</span></dt>
7841 <dd><p>
7842                   If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7843                   on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7844                   in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7845                   or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7846                   unblocks one of those threads.
7847                 </p></dd>
7848 <dt><span class="term">Throws:</span></dt>
7849 <dd><p>
7850                   Nothing.
7851                 </p></dd>
7852 </dl>
7853 </div>
7854 </div>
7855 <div class="section">
7856 <div class="titlepage"><div><div><h5 class="title">
7857 <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>
7858 </h5></div></div></div>
7859 <div class="variablelist">
7860 <p class="title"><b></b></p>
7861 <dl class="variablelist">
7862 <dt><span class="term">Effects:</span></dt>
7863 <dd><p>
7864                   If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7865                   on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7866                   in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7867                   or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7868                   unblocks all of those threads.
7869                 </p></dd>
7870 <dt><span class="term">Throws:</span></dt>
7871 <dd><p>
7872                   Nothing.
7873                 </p></dd>
7874 </dl>
7875 </div>
7876 </div>
7877 <div class="section">
7878 <div class="titlepage"><div><div><h5 class="title">
7879 <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&lt;typename lock_type&gt; void wait(lock_type&amp; lock)"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
7880           <span class="identifier">lock</span><span class="special">)</span></code></a>
7881 </h5></div></div></div>
7882 <div class="variablelist">
7883 <p class="title"><b></b></p>
7884 <dl class="variablelist">
7885 <dt><span class="term">Effects:</span></dt>
7886 <dd><p>
7887                   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.
7888                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7889                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7890                   or spuriously. When the thread is unblocked (for whatever reason),
7891                   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
7892                   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
7893                   exception.
7894                 </p></dd>
7895 <dt><span class="term">Postcondition:</span></dt>
7896 <dd><p>
7897                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7898                   by the current thread.
7899                 </p></dd>
7900 <dt><span class="term">Throws:</span></dt>
7901 <dd><p>
7902                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7903                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7904                   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>
7905                   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
7906                   with the current thread of execution.
7907                 </p></dd>
7908 </dl>
7909 </div>
7910 </div>
7911 <div class="section">
7912 <div class="titlepage"><div><div><h5 class="title">
7913 <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&lt;typename lock_type,typename predicate_type&gt; void wait(lock_type&amp; lock, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
7914           <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7915           <span class="identifier">pred</span><span class="special">)</span></code></a>
7916 </h5></div></div></div>
7917 <div class="variablelist">
7918 <p class="title"><b></b></p>
7919 <dl class="variablelist">
7920 <dt><span class="term">Effects:</span></dt>
7921 <dd>
7922 <p>
7923                   As-if
7924 </p>
7925 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7926 <span class="special">{</span>
7927     <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
7928 <span class="special">}</span>
7929 </pre>
7930 <p>
7931                 </p>
7932 </dd>
7933 </dl>
7934 </div>
7935 </div>
7936 <div class="section">
7937 <div class="titlepage"><div><div><h5 class="title">
7938 <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&lt;typename lock_type&gt; bool timed_wait(lock_type&amp; lock,boost::system_time const&amp; abs_time)"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</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">&amp;</span>
7939           <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">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7940 </h5></div></div></div>
7941 <div class="variablelist">
7942 <p class="title"><b></b></p>
7943 <dl class="variablelist">
7944 <dt><span class="term">Effects:</span></dt>
7945 <dd><p>
7946                   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.
7947                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7948                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7949                   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
7950                   the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7951                   or spuriously. When the thread is unblocked (for whatever reason),
7952                   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
7953                   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
7954                   exception.
7955                 </p></dd>
7956 <dt><span class="term">Returns:</span></dt>
7957 <dd><p>
7958                   <code class="computeroutput"><span class="keyword">false</span></code> if the call
7959                   is returning because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7960                   was reached, <code class="computeroutput"><span class="keyword">true</span></code>
7961                   otherwise.
7962                 </p></dd>
7963 <dt><span class="term">Postcondition:</span></dt>
7964 <dd><p>
7965                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7966                   by the current thread.
7967                 </p></dd>
7968 <dt><span class="term">Throws:</span></dt>
7969 <dd><p>
7970                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7971                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7972                   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>
7973                   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
7974                   with the current thread of execution.
7975                 </p></dd>
7976 </dl>
7977 </div>
7978 </div>
7979 <div class="section">
7980 <div class="titlepage"><div><div><h5 class="title">
7981 <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&lt;typename lock_type,typename duration_type&gt; bool timed_wait(lock_type&amp; lock,duration_type const&amp; rel_time)"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
7982           <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span>
7983           <span class="keyword">const</span><span class="special">&amp;</span>
7984           <span class="identifier">rel_time</span><span class="special">)</span></code></a>
7985 </h5></div></div></div>
7986 <div class="variablelist">
7987 <p class="title"><b></b></p>
7988 <dl class="variablelist">
7989 <dt><span class="term">Effects:</span></dt>
7990 <dd><p>
7991                   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.
7992                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7993                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7994                   after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7995                   argument has elapsed, or spuriously. When the thread is unblocked
7996                   (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>
7997                   before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7998                   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>
7999                   if the function exits with an exception.
8000                 </p></dd>
8001 <dt><span class="term">Returns:</span></dt>
8002 <dd><p>
8003                   <code class="computeroutput"><span class="keyword">false</span></code> if the call
8004                   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.
8005                 </p></dd>
8006 <dt><span class="term">Postcondition:</span></dt>
8007 <dd><p>
8008                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8009                   by the current thread.
8010                 </p></dd>
8011 <dt><span class="term">Throws:</span></dt>
8012 <dd><p>
8013                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8014                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8015                   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>
8016                   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
8017                   with the current thread of execution.
8018                 </p></dd>
8019 </dl>
8020 </div>
8021 <div class="note"><table border="0" summary="Note">
8022 <tr>
8023 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
8024 <th align="left">Note</th>
8025 </tr>
8026 <tr><td align="left" valign="top"><p>
8027               The duration overload of timed_wait is difficult to use correctly.
8028               The overload taking a predicate should be preferred in most cases.
8029             </p></td></tr>
8030 </table></div>
8031 </div>
8032 <div class="section">
8033 <div class="titlepage"><div><div><h5 class="title">
8034 <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&lt;typename lock_type,typename predicate_type&gt; bool timed_wait(lock_type&amp; lock, boost::system_time const&amp; abs_time, predicate_type pred)"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
8035           <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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>
8036           <span class="keyword">const</span><span class="special">&amp;</span>
8037           <span class="identifier">abs_time</span><span class="special">,</span>
8038           <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8039 </h5></div></div></div>
8040 <div class="variablelist">
8041 <p class="title"><b></b></p>
8042 <dl class="variablelist">
8043 <dt><span class="term">Effects:</span></dt>
8044 <dd>
8045 <p>
8046                   As-if
8047 </p>
8048 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
8049 <span class="special">{</span>
8050     <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>
8051     <span class="special">{</span>
8052         <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
8053     <span class="special">}</span>
8054 <span class="special">}</span>
8055 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
8056 </pre>
8057 <p>
8058                 </p>
8059 </dd>
8060 </dl>
8061 </div>
8062 </div>
8063 <div class="section">
8064 <div class="titlepage"><div><div><h5 class="title">
8065 <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 &lt;class lock_type, class Clock, class Duration&gt; cv_status wait_until(lock_type&amp; lock, const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span> <span class="identifier">cv_status</span>
8066           <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
8067           <span class="identifier">lock</span><span class="special">,</span>
8068           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
8069 </h5></div></div></div>
8070 <div class="variablelist">
8071 <p class="title"><b></b></p>
8072 <dl class="variablelist">
8073 <dt><span class="term">Effects:</span></dt>
8074 <dd><p>
8075                   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.
8076                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
8077                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
8078                   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
8079                   the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
8080                   or spuriously. When the thread is unblocked (for whatever reason),
8081                   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
8082                   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
8083                   exception.
8084                 </p></dd>
8085 <dt><span class="term">Returns:</span></dt>
8086 <dd><p>
8087                   <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
8088                   because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
8089                   was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
8090                   otherwise.
8091                 </p></dd>
8092 <dt><span class="term">Postcondition:</span></dt>
8093 <dd><p>
8094                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8095                   by the current thread.
8096                 </p></dd>
8097 <dt><span class="term">Throws:</span></dt>
8098 <dd><p>
8099                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8100                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8101                   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>
8102                   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
8103                   with the current thread of execution.
8104                 </p></dd>
8105 </dl>
8106 </div>
8107 </div>
8108 <div class="section">
8109 <div class="titlepage"><div><div><h5 class="title">
8110 <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 &lt;class lock_type, class Rep, class Period&gt; cv_status wait_for(lock_type&amp; lock, const chrono::duration&lt;Rep, Period&gt;&amp; rel_time)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span> <span class="identifier">cv_status</span>
8111           <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
8112           <span class="identifier">lock</span><span class="special">,</span>
8113           <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span></code></a>
8114 </h5></div></div></div>
8115 <div class="variablelist">
8116 <p class="title"><b></b></p>
8117 <dl class="variablelist">
8118 <dt><span class="term">Effects:</span></dt>
8119 <dd><p>
8120                   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.
8121                   The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
8122                   or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
8123                   after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
8124                   argument has elapsed, or spuriously. When the thread is unblocked
8125                   (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>
8126                   before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
8127                   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>
8128                   if the function exits with an exception.
8129                 </p></dd>
8130 <dt><span class="term">Returns:</span></dt>
8131 <dd><p>
8132                   <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
8133                   because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
8134                   was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
8135                   otherwise.
8136                 </p></dd>
8137 <dt><span class="term">Postcondition:</span></dt>
8138 <dd><p>
8139                   <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8140                   by the current thread.
8141                 </p></dd>
8142 <dt><span class="term">Throws:</span></dt>
8143 <dd><p>
8144                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8145                   occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8146                   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>
8147                   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
8148                   with the current thread of execution.
8149                 </p></dd>
8150 </dl>
8151 </div>
8152 <div class="note"><table border="0" summary="Note">
8153 <tr>
8154 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
8155 <th align="left">Note</th>
8156 </tr>
8157 <tr><td align="left" valign="top"><p>
8158               The duration overload of timed_wait is difficult to use correctly.
8159               The overload taking a predicate should be preferred in most cases.
8160             </p></td></tr>
8161 </table></div>
8162 </div>
8163 <div class="section">
8164 <div class="titlepage"><div><div><h5 class="title">
8165 <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 &lt;class lock_type, class Clock, class Duration, class Predicate&gt; bool wait_until(lock_type&amp; lock, const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
8166           <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span>
8167           <span class="identifier">abs_time</span><span class="special">,</span>
8168           <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8169 </h5></div></div></div>
8170 <div class="variablelist">
8171 <p class="title"><b></b></p>
8172 <dl class="variablelist">
8173 <dt><span class="term">Effects:</span></dt>
8174 <dd>
8175 <p>
8176                   As-if
8177 </p>
8178 <pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
8179 <span class="special">{</span>
8180     <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 &lt;class lock_type, class Clock, class Duration&gt; cv_status wait_until(lock_type&amp; lock, const chrono::time_point&lt;Clock, Duration&gt;&amp; 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>
8181     <span class="special">{</span>
8182         <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
8183     <span class="special">}</span>
8184 <span class="special">}</span>
8185 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
8186 </pre>
8187 <p>
8188                 </p>
8189 </dd>
8190 </dl>
8191 </div>
8192 </div>
8193 <div class="section">
8194 <div class="titlepage"><div><div><h5 class="title">
8195 <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 &lt;class lock_type, class Rep, class Period, class Predicate&gt; bool wait_for(lock_type&amp; lock, const chrono::duration&lt;Rep, Period&gt;&amp; rel_time, Predicate pred)"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
8196           <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span>
8197           <span class="identifier">rel_time</span><span class="special">,</span>
8198           <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8199 </h5></div></div></div>
8200 <div class="variablelist">
8201 <p class="title"><b></b></p>
8202 <dl class="variablelist">
8203 <dt><span class="term">Effects:</span></dt>
8204 <dd>
8205 <p>
8206                   As-if
8207 </p>
8208 <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>
8209 </pre>
8210 <p>
8211                 </p>
8212 </dd>
8213 </dl>
8214 </div>
8215 </div>
8216 </div>
8217 <div class="section">
8218 <div class="titlepage"><div><div><h4 class="title">
8219 <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
8220         <code class="computeroutput"><span class="identifier">condition</span></code> DEPRECATED V3</a>
8221 </h4></div></div></div>
8222 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/condition.hpp&gt;</span>
8223 <span class="keyword">namespace</span> <span class="identifier">boost</span>
8224 <span class="special">{</span>
8225
8226   <span class="keyword">typedef</span> <span class="identifier">condition_variable_any</span> <span class="identifier">condition</span><span class="special">;</span>
8227
8228 <span class="special">}</span>
8229 </pre>
8230 <p>
8231           The typedef <code class="computeroutput"><span class="identifier">condition</span></code> is
8232           provided for backwards compatibility with previous boost releases.
8233         </p>
8234 </div>
8235 <div class="section">
8236 <div class="titlepage"><div><div><h4 class="title">
8237 <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
8238         Function <code class="computeroutput"><span class="identifier">notify_all_at_thread_exit</span></code>()</a>
8239 </h4></div></div></div>
8240 <pre class="programlisting"><span class="comment">// #include &lt;boost/thread/condition_variable.hpp&gt;</span>
8241
8242 <span class="keyword">namespace</span> <span class="identifier">boost</span>
8243 <span class="special">{</span>
8244   <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">&amp;</span> <span class="identifier">cond</span><span class="special">,</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">lk</span><span class="special">);</span>
8245 <span class="special">}</span>
8246 </pre>
8247 <div class="variablelist">
8248 <p class="title"><b></b></p>
8249 <dl class="variablelist">
8250 <dt><span class="term">Requires:</span></dt>
8251 <dd><p>
8252                 <code class="computeroutput"><span class="identifier">lk</span></code> is locked by the
8253                 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
8254                 of the lock arguments supplied by all concurrently waiting (via
8255                 <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>)
8256                 threads.
8257               </p></dd>
8258 <dt><span class="term">Effects:</span></dt>
8259 <dd>
8260 <p>
8261                 transfers ownership of the lock associated with <code class="computeroutput"><span class="identifier">lk</span></code>
8262                 into internal storage and schedules <code class="computeroutput"><span class="identifier">cond</span></code>
8263                 to be notified when the current thread exits, after all objects of
8264                 thread storage duration associated with the current thread have been
8265                 destroyed. This notification shall be as if
8266               </p>
8267 <p>
8268 </p>
8269 <pre class="programlisting"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
8270 <span class="identifier">cond</span><span class="special">.</span><span class="identifier">notify_all</span><span class="special">();</span>
8271 </pre>
8272 <p>
8273               </p>
8274 </dd>
8275 </dl>
8276 </div>
8277 </div>
8278 </div>
8279 <div class="section">
8280 <div class="titlepage"><div><div><h3 class="title">
8281 <a name="thread.synchronization.once"></a><a class="link" href="synchronization.html#thread.synchronization.once" title="One-time Initialization">One-time Initialization</a>
8282 </h3></div></div></div>
8283 <div class="toc"><dl class="toc">
8284 <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>
8285 <dt><span class="section"><a href="synchronization.html#thread.synchronization.once.call_once">Non-member function
8286         <code class="computeroutput"><span class="identifier">call_once</span></code></a></span></dt>
8287 </dl></div>
8288 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
8289
8290 <span class="keyword">namespace</span> <span class="identifier">boost</span>
8291 <span class="special">{</span>
8292   <span class="keyword">struct</span> <span class="identifier">once_flag</span><span class="special">;</span>
8293   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
8294   <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">&amp;</span> <span class="identifier">flag</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">ArgTypes</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
8295
8296 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span>
8297   <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">&amp;</span> <span class="identifier">flag</span><span class="special">);</span>
8298 <span class="preprocessor">#endif</span>
8299
8300 <span class="special">}</span>
8301 </pre>
8302 <div class="warning"><table border="0" summary="Warning">
8303 <tr>
8304 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
8305 <th align="left">Warning</th>
8306 </tr>
8307 <tr><td align="left" valign="top"><p>
8308           the variadic prototype is provided only on C++11 compilers supporting variadic
8309           templates, otherwise the interface is limited up to 3 parameters.
8310         </p></td></tr>
8311 </table></div>
8312 <div class="warning"><table border="0" summary="Warning">
8313 <tr>
8314 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
8315 <th align="left">Warning</th>
8316 </tr>
8317 <tr><td align="left" valign="top"><p>
8318           the move semantics is ensured only on C++11 compilers supporting SFINAE
8319           expression, decltype N3276 and auto. Waiting for a boost::bind that is
8320           move aware.
8321         </p></td></tr>
8322 </table></div>
8323 <p>
8324         <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">call_once</span></code> provides a mechanism for ensuring
8325         that an initialization routine is run exactly once without data races or
8326         deadlocks.
8327       </p>
8328 <div class="section">
8329 <div class="titlepage"><div><div><h4 class="title">
8330 <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>
8331 </h4></div></div></div>
8332 <pre class="programlisting"><span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_ONCE_CXX11</span>
8333 <span class="keyword">struct</span> <span class="identifier">once_flag</span>
8334 <span class="special">{</span>
8335   <span class="identifier">constexprr</span> <span class="identifier">once_flag</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
8336   <span class="identifier">once_flag</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">once_flag</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8337   <span class="identifier">once_flag</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">const</span> <span class="identifier">once_flag</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8338 <span class="special">};</span>
8339 <span class="preprocessor">#else</span>
8340 <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>
8341 <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>
8342 <span class="preprocessor">#endif</span>
8343 </pre>
8344 <p>
8345           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
8346           <code class="computeroutput"><span class="identifier">BOOST_ONCE_INIT</span></code> if BOOST_THREAD_PROVIDES_ONCE_CXX11
8347           is not defined
8348         </p>
8349 <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>
8350 </pre>
8351 </div>
8352 <div class="section">
8353 <div class="titlepage"><div><div><h4 class="title">
8354 <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
8355         <code class="computeroutput"><span class="identifier">call_once</span></code></a>
8356 </h4></div></div></div>
8357 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
8358 <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">&amp;</span> <span class="identifier">flag</span><span class="special">,</span> <span class="identifier">Function</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">ArgTypes</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
8359 </pre>
8360 <div class="variablelist">
8361 <p class="title"><b></b></p>
8362 <dl class="variablelist">
8363 <dt><span class="term">Requires:</span></dt>
8364 <dd><p>
8365                 <code class="computeroutput"><span class="identifier">Function</span></code> and each
8366                 or the <code class="computeroutput"><span class="identifier">ArgTypes</span></code> are
8367                 <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
8368                 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">&lt;</span><span class="identifier">Function</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)),</span>
8369                 <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">&lt;</span><span class="identifier">ArgTypes</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...)</span></code>
8370                 shall be well formed.
8371               </p></dd>
8372 <dt><span class="term">Effects:</span></dt>
8373 <dd><p>
8374                 Calls to <code class="computeroutput"><span class="identifier">call_once</span></code>
8375                 on the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8376                 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
8377                 <code class="computeroutput"><span class="identifier">func</span></code> is called as-if
8378                 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">&lt;</span><span class="identifier">Function</span><span class="special">&gt;(</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">&lt;</span><span class="identifier">ArgTypes</span><span class="special">&gt;(</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
8379                 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">&lt;</span><span class="identifier">Function</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)),</span>
8380                 <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">&lt;</span><span class="identifier">ArgTypes</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...)</span></code>
8381                 returns without exception. If an exception is thrown, the exception
8382                 is propagated to the caller. If there has been a prior effective
8383                 <code class="computeroutput"><span class="identifier">call_once</span></code> on the
8384                 same <code class="computeroutput"><span class="identifier">once_flag</span></code> object,
8385                 the <code class="computeroutput"><span class="identifier">call_once</span></code> returns
8386                 without invoking <code class="computeroutput"><span class="identifier">func</span></code>.
8387               </p></dd>
8388 <dt><span class="term">Synchronization:</span></dt>
8389 <dd><p>
8390                 The completion of an effective <code class="computeroutput"><span class="identifier">call_once</span></code>
8391                 invocation on a <code class="computeroutput"><span class="identifier">once_flag</span></code>
8392                 object, synchronizes with all subsequent <code class="computeroutput"><span class="identifier">call_once</span></code>
8393                 invocations on the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8394                 object.
8395               </p></dd>
8396 <dt><span class="term">Throws:</span></dt>
8397 <dd><p>
8398                 <code class="computeroutput"><span class="identifier">thread_resource_error</span></code>
8399                 when the effects cannot be achieved or any exception propagated from
8400                 <code class="computeroutput"><span class="identifier">func</span></code>.
8401               </p></dd>
8402 <dt><span class="term">Note:</span></dt>
8403 <dd><p>
8404                 The function passed to <code class="computeroutput"><span class="identifier">call_once</span></code>
8405                 must not also call <code class="computeroutput"><span class="identifier">call_once</span></code>
8406                 passing the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8407                 object. This may cause deadlock, or invoking the passed function
8408                 a second time. The alternative is to allow the second call to return
8409                 immediately, but that assumes the code knows it has been called recursively,
8410                 and can proceed even though the call to <code class="computeroutput"><span class="identifier">call_once</span></code>
8411                 didn't actually call the function, in which case it could also avoid
8412                 calling <code class="computeroutput"><span class="identifier">call_once</span></code>
8413                 recursively.
8414               </p></dd>
8415 <dt><span class="term">Note:</span></dt>
8416 <dd><p>
8417                 On some compilers this function has some restrictions, e.g. if variadic
8418                 templates are not supported the number of arguments is limited to
8419                 3; .
8420               </p></dd>
8421 </dl>
8422 </div>
8423 <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">&amp;</span> <span class="identifier">flag</span><span class="special">);</span>
8424 </pre>
8425 <p>
8426           This second overload is provided for backwards compatibility and is deprecated.
8427           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>.
8428         </p>
8429 </div>
8430 </div>
8431 <div class="section">
8432 <div class="titlepage"><div><div><h3 class="title">
8433 <a name="thread.synchronization.barriers"></a><a class="link" href="synchronization.html#thread.synchronization.barriers" title="Barriers -- EXTENSION">Barriers -- EXTENSION</a>
8434 </h3></div></div></div>
8435 <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>
8436 <p>
8437         A barrier is a simple concept. Also known as a <span class="emphasis"><em>rendezvous</em></span>,
8438         it is a synchronization point between multiple threads. The barrier is configured
8439         for a particular number of threads (<code class="computeroutput"><span class="identifier">n</span></code>),
8440         and as threads reach the barrier they must wait until all <code class="computeroutput"><span class="identifier">n</span></code>
8441         threads have arrived. Once the <code class="computeroutput"><span class="identifier">n</span></code>-th
8442         thread has reached the barrier, all the waiting threads can proceed, and
8443         the barrier is reset.
8444       </p>
8445 <div class="section">
8446 <div class="titlepage"><div><div><h4 class="title">
8447 <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>
8448 </h4></div></div></div>
8449 <div class="toc"><dl class="toc">
8450 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__">Constructor
8451           <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>
8452 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____">Constructor
8453           <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">&amp;&amp;)</span></code></a></span></dt>
8454 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.destructor___barrier___">Destructor
8455           <code class="computeroutput"><span class="special">~</span><span class="identifier">barrier</span><span class="special">()</span></code></a></span></dt>
8456 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.member_function__wait___">Member
8457           Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a></span></dt>
8458 <dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.member_function__count_down_and_wait___">Member
8459           Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a></span></dt>
8460 </dl></div>
8461 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
8462
8463 <span class="keyword">class</span> <span class="identifier">barrier</span>
8464 <span class="special">{</span>
8465 <span class="keyword">public</span><span class="special">:</span>
8466     <span class="identifier">barrier</span><span class="special">(</span><span class="identifier">barrier</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8467     <span class="identifier">barrier</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">barrier</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8468
8469     <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>
8470     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
8471     <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">&amp;&amp;);</span>
8472
8473     <span class="special">~</span><span class="identifier">barrier</span><span class="special">();</span>
8474
8475     <span class="keyword">bool</span> <span class="identifier">wait</span><span class="special">();</span>
8476     <span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8477 <span class="special">};</span>
8478 </pre>
8479 <p>
8480           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.
8481         </p>
8482 <div class="section">
8483 <div class="titlepage"><div><div><h5 class="title">
8484 <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
8485           <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>
8486 </h5></div></div></div>
8487 <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>
8488 </pre>
8489 <div class="variablelist">
8490 <p class="title"><b></b></p>
8491 <dl class="variablelist">
8492 <dt><span class="term">Effects:</span></dt>
8493 <dd><p>
8494                   Construct a barrier for <code class="computeroutput"><span class="identifier">count</span></code>
8495                   threads.
8496                 </p></dd>
8497 <dt><span class="term">Throws:</span></dt>
8498 <dd><p>
8499                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8500                   occurs.
8501                 </p></dd>
8502 </dl>
8503 </div>
8504 </div>
8505 <div class="section">
8506 <div class="titlepage"><div><div><h5 class="title">
8507 <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&amp;&amp;)">Constructor
8508           <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">&amp;&amp;)</span></code></a>
8509 </h5></div></div></div>
8510 <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">&amp;&amp;</span> <span class="identifier">completion</span><span class="special">);</span>
8511 </pre>
8512 <div class="variablelist">
8513 <p class="title"><b></b></p>
8514 <dl class="variablelist">
8515 <dt><span class="term">Requires:</span></dt>
8516 <dd><p>
8517                   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>
8518                   or <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">int</span></code>.
8519                 </p></dd>
8520 <dt><span class="term">Effects:</span></dt>
8521 <dd><p>
8522                   Construct a barrier for <code class="computeroutput"><span class="identifier">count</span></code>
8523                   threads and a completion function <code class="computeroutput"><span class="identifier">completion</span></code>.
8524                 </p></dd>
8525 <dt><span class="term">Throws:</span></dt>
8526 <dd><p>
8527                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8528                   occurs.
8529                 </p></dd>
8530 </dl>
8531 </div>
8532 </div>
8533 <div class="section">
8534 <div class="titlepage"><div><div><h5 class="title">
8535 <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
8536           <code class="computeroutput"><span class="special">~</span><span class="identifier">barrier</span><span class="special">()</span></code></a>
8537 </h5></div></div></div>
8538 <pre class="programlisting"><span class="special">~</span><span class="identifier">barrier</span><span class="special">();</span>
8539 </pre>
8540 <div class="variablelist">
8541 <p class="title"><b></b></p>
8542 <dl class="variablelist">
8543 <dt><span class="term">Precondition:</span></dt>
8544 <dd><p>
8545                   No threads are waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8546                 </p></dd>
8547 <dt><span class="term">Effects:</span></dt>
8548 <dd><p>
8549                   Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8550                 </p></dd>
8551 <dt><span class="term">Throws:</span></dt>
8552 <dd><p>
8553                   Nothing.
8554                 </p></dd>
8555 </dl>
8556 </div>
8557 </div>
8558 <div class="section">
8559 <div class="titlepage"><div><div><h5 class="title">
8560 <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
8561           Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
8562 </h5></div></div></div>
8563 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">wait</span><span class="special">();</span>
8564 </pre>
8565 <div class="variablelist">
8566 <p class="title"><b></b></p>
8567 <dl class="variablelist">
8568 <dt><span class="term">Effects:</span></dt>
8569 <dd><p>
8570                   Block until <code class="computeroutput"><span class="identifier">count</span></code>
8571                   threads have called <code class="computeroutput"><span class="identifier">wait</span></code>
8572                   or <code class="computeroutput"><span class="identifier">count_down_and_wait</span></code>
8573                   on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8574                   When the <code class="computeroutput"><span class="identifier">count</span></code>-th
8575                   thread calls <code class="computeroutput"><span class="identifier">wait</span></code>,
8576                   the barrier is reset and all waiting threads are unblocked. The
8577                   reset depends on whether the barrier was constructed with a completion
8578                   function or not. If there is no completion function or if the completion
8579                   function result is void, the reset consists in restoring the original
8580                   count. Otherwise the rest consist in assigning the result of the
8581                   completion function (which must not be 0).
8582                 </p></dd>
8583 <dt><span class="term">Returns:</span></dt>
8584 <dd><p>
8585                   <code class="computeroutput"><span class="keyword">true</span></code> for exactly one
8586                   thread from each batch of waiting threads, <code class="computeroutput"><span class="keyword">false</span></code>
8587                   otherwise.
8588                 </p></dd>
8589 <dt><span class="term">Throws:</span></dt>
8590 <dd>
8591 <p>
8592                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8593                   occurs.
8594                 </p>
8595 <p>
8596                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8597                   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>
8598                   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
8599                   with the current thread of execution.
8600                 </p>
8601 </dd>
8602 <dt><span class="term">Notes:</span></dt>
8603 <dd><p>
8604                   <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
8605                   is an <span class="emphasis"><em>interruption point</em></span>.
8606                 </p></dd>
8607 </dl>
8608 </div>
8609 </div>
8610 <div class="section">
8611 <div class="titlepage"><div><div><h5 class="title">
8612 <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
8613           Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a>
8614 </h5></div></div></div>
8615 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8616 </pre>
8617 <div class="variablelist">
8618 <p class="title"><b></b></p>
8619 <dl class="variablelist">
8620 <dt><span class="term">Effects:</span></dt>
8621 <dd><p>
8622                   Block until <code class="computeroutput"><span class="identifier">count</span></code>
8623                   threads have called <code class="computeroutput"><span class="identifier">wait</span></code>
8624                   or <code class="computeroutput"><span class="identifier">count_down_and_wait</span></code>
8625                   on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8626                   When the <code class="computeroutput"><span class="identifier">count</span></code>-th
8627                   thread calls <code class="computeroutput"><span class="identifier">wait</span></code>,
8628                   the barrier is reset and all waiting threads are unblocked. The
8629                   reset depends on whether the barrier was constructed with a completion
8630                   function or not. If there is no completion function or if the completion
8631                   function result is void, the reset consists in restoring the original
8632                   count. Otherwise the rest consist in assigning the result of the
8633                   completion function (which must not be 0).
8634                 </p></dd>
8635 <dt><span class="term">Throws:</span></dt>
8636 <dd>
8637 <p>
8638                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8639                   occurs.
8640                 </p>
8641 <p>
8642                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8643                   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>
8644                   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
8645                   with the current thread of execution.
8646                 </p>
8647 </dd>
8648 <dt><span class="term">Notes:</span></dt>
8649 <dd><p>
8650                   <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code> is an <span class="emphasis"><em>interruption
8651                   point</em></span>.
8652                 </p></dd>
8653 </dl>
8654 </div>
8655 </div>
8656 </div>
8657 </div>
8658 <div class="section">
8659 <div class="titlepage"><div><div><h3 class="title">
8660 <a name="thread.synchronization.latches"></a><a class="link" href="synchronization.html#thread.synchronization.latches" title="Latches -- EXPERIMENTAL">Latches -- EXPERIMENTAL</a>
8661 </h3></div></div></div>
8662 <div class="toc"><dl class="toc">
8663 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.introdcution">Introdcution</a></span></dt>
8664 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.examples">Examples</a></span></dt>
8665 <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>
8666 </dl></div>
8667 <div class="section">
8668 <div class="titlepage"><div><div><h4 class="title">
8669 <a name="thread.synchronization.latches.introdcution"></a><a class="link" href="synchronization.html#thread.synchronization.latches.introdcution" title="Introdcution">Introdcution</a>
8670 </h4></div></div></div>
8671 <p>
8672           Latches are a thread co-ordination mechanism that allow one or more threads
8673           to block until one or more threads have reached a point.
8674         </p>
8675 </div>
8676 <div class="section">
8677 <div class="titlepage"><div><div><h4 class="title">
8678 <a name="thread.synchronization.latches.examples"></a><a class="link" href="synchronization.html#thread.synchronization.latches.examples" title="Examples">Examples</a>
8679 </h4></div></div></div>
8680 <p>
8681           Sample use cases for the latch include:
8682         </p>
8683 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
8684 <li class="listitem">
8685               Setting multiple threads to perform a task, and then waiting until
8686               all threads have reached a common point.
8687             </li>
8688 <li class="listitem">
8689               Creating multiple threads, which wait for a signal before advancing
8690               beyond a common point.
8691             </li>
8692 </ul></div>
8693 <p>
8694           An example of the first use case would be as follows:
8695         </p>
8696 <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>
8697   <span class="identifier">latch</span> <span class="identifier">completion_latch</span><span class="special">(</span><span class="identifier">NTASKS</span><span class="special">);</span>
8698   <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">&lt;</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>
8699     <span class="identifier">pool</span><span class="special">-&gt;</span><span class="identifier">submit</span><span class="special">([&amp;]</span> <span class="special">{</span>
8700       <span class="comment">// perform work</span>
8701       <span class="special">...</span>
8702       <span class="identifier">completion_latch</span><span class="special">.</span><span class="identifier">count_down</span><span class="special">();</span>
8703     <span class="special">}));</span>
8704   <span class="special">}</span>
8705   <span class="comment">// Block until work is done</span>
8706   <span class="identifier">completion_latch</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span>
8707 <span class="special">}</span>
8708 </pre>
8709 <p>
8710           An example of the second use case is shown below. We need to load data
8711           and then process it using a number of threads. Loading the data is I/O
8712           bound, whereas starting threads and creating data structures is CPU bound.
8713           By running these in parallel, throughput can be increased.
8714         </p>
8715 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">DoWork</span><span class="special">()</span> <span class="special">{</span>
8716   <span class="identifier">latch</span> <span class="identifier">start_latch</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
8717   <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">thread</span><span class="special">*&gt;</span> <span class="identifier">workers</span><span class="special">;</span>
8718   <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">&lt;</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>
8719     <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">([&amp;]</span> <span class="special">{</span>
8720       <span class="comment">// Initialize data structures. This is CPU bound.</span>
8721       <span class="special">...</span>
8722       <span class="identifier">start_latch</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span>
8723       <span class="comment">// perform work</span>
8724       <span class="special">...</span>
8725     <span class="special">}));</span>
8726   <span class="special">}</span>
8727   <span class="comment">// Load input data. This is I/O bound.</span>
8728   <span class="special">...</span>
8729   <span class="comment">// Threads can now start processing</span>
8730   <span class="identifier">start_latch</span><span class="special">.</span><span class="identifier">count_down</span><span class="special">();</span>
8731   <span class="special">}</span>
8732 </pre>
8733 </div>
8734 <div class="section">
8735 <div class="titlepage"><div><div><h4 class="title">
8736 <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>
8737 </h4></div></div></div>
8738 <div class="toc"><dl class="toc">
8739 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.constructor__latch_std__size_t__">Constructor
8740           <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>
8741 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.destructor___latch___">Destructor
8742           <code class="computeroutput"><span class="special">~</span><span class="identifier">latch</span><span class="special">()</span></code></a></span></dt>
8743 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait">Member
8744           Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a></span></dt>
8745 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.try_wait">Member
8746           Function <code class="computeroutput"><span class="identifier">try_wait</span><span class="special">()</span></code></a></span></dt>
8747 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait_for">Member
8748           Function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span>
8749           </code></a></span></dt>
8750 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait_until">Member
8751           Function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a></span></dt>
8752 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.count_down">Member
8753           Function <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code></a></span></dt>
8754 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.count_down_and_wait">Member
8755           Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a></span></dt>
8756 <dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.reset">Member
8757           Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a></span></dt>
8758 </dl></div>
8759 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
8760
8761 <span class="keyword">class</span> <span class="identifier">latch</span>
8762 <span class="special">{</span>
8763 <span class="keyword">public</span><span class="special">:</span>
8764     <span class="identifier">latch</span><span class="special">(</span><span class="identifier">latch</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8765     <span class="identifier">latch</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">latch</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8766
8767     <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>
8768     <span class="special">~</span><span class="identifier">latch</span><span class="special">();</span>
8769
8770     <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
8771     <span class="keyword">bool</span> <span class="identifier">try_wait</span><span class="special">();</span>
8772     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
8773     <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
8774     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
8775     <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
8776     <span class="keyword">void</span> <span class="identifier">count_down</span><span class="special">();</span>
8777     <span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8778
8779 <span class="special">};</span>
8780 </pre>
8781 <p>
8782           A latch maintains an internal counter that is initialized when the latch
8783           is created. One or more threads may block waiting until the counter is
8784           decremented to 0.
8785         </p>
8786 <p>
8787           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.
8788         </p>
8789 <div class="section">
8790 <div class="titlepage"><div><div><h5 class="title">
8791 <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
8792           <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>
8793 </h5></div></div></div>
8794 <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>
8795 </pre>
8796 <div class="variablelist">
8797 <p class="title"><b></b></p>
8798 <dl class="variablelist">
8799 <dt><span class="term">Effects:</span></dt>
8800 <dd><p>
8801                   Construct a latch with is initial value for the internal counter.
8802                 </p></dd>
8803 <dt><span class="term">Note:</span></dt>
8804 <dd><p>
8805                   The counter could be zero.
8806                 </p></dd>
8807 <dt><span class="term">Throws:</span></dt>
8808 <dd><p>
8809                   Nothing.
8810                 </p></dd>
8811 </dl>
8812 </div>
8813 </div>
8814 <div class="section">
8815 <div class="titlepage"><div><div><h5 class="title">
8816 <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
8817           <code class="computeroutput"><span class="special">~</span><span class="identifier">latch</span><span class="special">()</span></code></a>
8818 </h5></div></div></div>
8819 <pre class="programlisting"><span class="special">~</span><span class="identifier">latch</span><span class="special">();</span>
8820 </pre>
8821 <div class="variablelist">
8822 <p class="title"><b></b></p>
8823 <dl class="variablelist">
8824 <dt><span class="term">Precondition:</span></dt>
8825 <dd><p>
8826                   No threads are waiting or invoking count_down on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8827                 </p></dd>
8828 <dt><span class="term">Effects:</span></dt>
8829 <dd><p>
8830                   Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
8831                   latch.
8832                 </p></dd>
8833 <dt><span class="term">Throws:</span></dt>
8834 <dd><p>
8835                   Nothing.
8836                 </p></dd>
8837 </dl>
8838 </div>
8839 </div>
8840 <div class="section">
8841 <div class="titlepage"><div><div><h5 class="title">
8842 <a name="thread.synchronization.latches.latch.wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait" title="Member Function wait()">Member
8843           Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
8844 </h5></div></div></div>
8845 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
8846 </pre>
8847 <div class="variablelist">
8848 <p class="title"><b></b></p>
8849 <dl class="variablelist">
8850 <dt><span class="term">Effects:</span></dt>
8851 <dd><p>
8852                   Block the calling thread until the internal count reaches the value
8853                   zero. Then all waiting threads are unblocked.
8854                 </p></dd>
8855 <dt><span class="term">Throws:</span></dt>
8856 <dd>
8857 <p>
8858                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8859                   occurs.
8860                 </p>
8861 <p>
8862                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8863                   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>
8864                   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
8865                   with the current thread of execution.
8866                 </p>
8867 </dd>
8868 <dt><span class="term">Notes:</span></dt>
8869 <dd><p>
8870                   <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
8871                   is an <span class="emphasis"><em>interruption point</em></span>.
8872                 </p></dd>
8873 </dl>
8874 </div>
8875 </div>
8876 <div class="section">
8877 <div class="titlepage"><div><div><h5 class="title">
8878 <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
8879           Function <code class="computeroutput"><span class="identifier">try_wait</span><span class="special">()</span></code></a>
8880 </h5></div></div></div>
8881 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">try_wait</span><span class="special">();</span>
8882 </pre>
8883 <div class="variablelist">
8884 <p class="title"><b></b></p>
8885 <dl class="variablelist">
8886 <dt><span class="term">Returns:</span></dt>
8887 <dd><p>
8888                   Returns true if the internal count is 0, and false otherwise. Does
8889                   not block the calling thread.
8890                 </p></dd>
8891 <dt><span class="term">Throws:</span></dt>
8892 <dd><p>
8893                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8894                   occurs.
8895                 </p></dd>
8896 </dl>
8897 </div>
8898 </div>
8899 <div class="section">
8900 <div class="titlepage"><div><div><h5 class="title">
8901 <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
8902           Function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span>
8903           </code></a>
8904 </h5></div></div></div>
8905 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
8906 <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">);</span>
8907 </pre>
8908 <div class="variablelist">
8909 <p class="title"><b></b></p>
8910 <dl class="variablelist">
8911 <dt><span class="term">Effects:</span></dt>
8912 <dd><p>
8913                   Block the calling thread until the internal count reaches the value
8914                   zero or the duration has been elapsed. If no timeout, all waiting
8915                   threads are unblocked.
8916                 </p></dd>
8917 <dt><span class="term">Returns:</span></dt>
8918 <dd><p>
8919                   cv_status::no_timeout if the internal count is 0, and cv_status::timeout
8920                   if duration has been elapsed.
8921                 </p></dd>
8922 <dt><span class="term">Throws:</span></dt>
8923 <dd>
8924 <p>
8925                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8926                   occurs.
8927                 </p>
8928 <p>
8929                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8930                   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>
8931                   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
8932                   with the current thread of execution.
8933                 </p>
8934 </dd>
8935 <dt><span class="term">Notes:</span></dt>
8936 <dd><p>
8937                   <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code>
8938                   is an <span class="emphasis"><em>interruption point</em></span>.
8939                 </p></dd>
8940 </dl>
8941 </div>
8942 </div>
8943 <div class="section">
8944 <div class="titlepage"><div><div><h5 class="title">
8945 <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
8946           Function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
8947 </h5></div></div></div>
8948 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
8949 <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
8950 </pre>
8951 <div class="variablelist">
8952 <p class="title"><b></b></p>
8953 <dl class="variablelist">
8954 <dt><span class="term">Effects:</span></dt>
8955 <dd><p>
8956                   Block the calling thread until the internal count reaches the value
8957                   zero or the time_point has been reached. If no timeout, all waiting
8958                   threads are unblocked.
8959                 </p></dd>
8960 <dt><span class="term">Returns:</span></dt>
8961 <dd><p>
8962                   cv_status::no_timeout if the internal count is 0, and cv_status::timeout
8963                   if time_point has been reached.
8964                 </p></dd>
8965 <dt><span class="term">Throws:</span></dt>
8966 <dd>
8967 <p>
8968                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8969                   occurs.
8970                 </p>
8971 <p>
8972                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8973                   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>
8974                   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
8975                   with the current thread of execution.
8976                 </p>
8977 </dd>
8978 <dt><span class="term">Notes:</span></dt>
8979 <dd><p>
8980                   <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code>
8981                   is an <span class="emphasis"><em>interruption point</em></span>.
8982                 </p></dd>
8983 </dl>
8984 </div>
8985 </div>
8986 <div class="section">
8987 <div class="titlepage"><div><div><h5 class="title">
8988 <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
8989           Function <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code></a>
8990 </h5></div></div></div>
8991 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down</span><span class="special">();</span>
8992 </pre>
8993 <div class="variablelist">
8994 <p class="title"><b></b></p>
8995 <dl class="variablelist">
8996 <dt><span class="term">Requires:</span></dt>
8997 <dd><p>
8998                   The internal counter is non zero.
8999                 </p></dd>
9000 <dt><span class="term">Effects:</span></dt>
9001 <dd><p>
9002                   Decrements the internal count by 1, and returns. If the count reaches
9003                   0, any threads blocked in wait() will be released.
9004                 </p></dd>
9005 <dt><span class="term">Throws:</span></dt>
9006 <dd>
9007 <p>
9008                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9009                   occurs.
9010                 </p>
9011 <p>
9012                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
9013                   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>
9014                   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
9015                   with the current thread of execution.
9016                 </p>
9017 </dd>
9018 <dt><span class="term">Notes:</span></dt>
9019 <dd><p>
9020                   <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code>
9021                   is an <span class="emphasis"><em>interruption point</em></span>.
9022                 </p></dd>
9023 </dl>
9024 </div>
9025 </div>
9026 <div class="section">
9027 <div class="titlepage"><div><div><h5 class="title">
9028 <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
9029           Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a>
9030 </h5></div></div></div>
9031 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
9032 </pre>
9033 <div class="variablelist">
9034 <p class="title"><b></b></p>
9035 <dl class="variablelist">
9036 <dt><span class="term">Requires:</span></dt>
9037 <dd><p>
9038                   The internal counter is non zero.
9039                 </p></dd>
9040 <dt><span class="term">Effects:</span></dt>
9041 <dd><p>
9042                   Decrements the internal count by 1. If the resulting count is not
9043                   0, blocks the calling thread until the internal count is decremented
9044                   to 0 by one or more other threads calling count_down() or count_down_and_wait().
9045                 </p></dd>
9046 <dt><span class="term">Throws:</span></dt>
9047 <dd>
9048 <p>
9049                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9050                   occurs.
9051                 </p>
9052 <p>
9053                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
9054                   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>
9055                   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
9056                   with the current thread of execution.
9057                 </p>
9058 </dd>
9059 <dt><span class="term">Notes:</span></dt>
9060 <dd><p>
9061                   <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code> is an <span class="emphasis"><em>interruption
9062                   point</em></span>.
9063                 </p></dd>
9064 </dl>
9065 </div>
9066 </div>
9067 <p>
9068           [
9069         </p>
9070 <div class="section">
9071 <div class="titlepage"><div><div><h5 class="title">
9072 <a name="thread.synchronization.latches.latch.reset"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.reset" title="Member Function reset()">Member
9073           Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a>
9074 </h5></div></div></div>
9075 <pre class="programlisting"><span class="identifier">reset</span><span class="special">(</span> <span class="identifier">size_t</span> <span class="special">);</span>
9076 </pre>
9077 <div class="variablelist">
9078 <p class="title"><b></b></p>
9079 <dl class="variablelist">
9080 <dt><span class="term">Requires:</span></dt>
9081 <dd><p>
9082                   This function may only be invoked when there are no other threads
9083                   currently inside the waiting functions.
9084                 </p></dd>
9085 <dt><span class="term">Returns:</span></dt>
9086 <dd><p>
9087                   Resets the latch with a new value for the initial thread count.
9088                 </p></dd>
9089 <dt><span class="term">Throws:</span></dt>
9090 <dd><p>
9091                   - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9092                   occurs.
9093                 </p></dd>
9094 </dl>
9095 </div>
9096 </div>
9097 <p>
9098           ]
9099         </p>
9100 </div>
9101 </div>
9102 <div class="section">
9103 <div class="titlepage"><div><div><h3 class="title">
9104 <a name="thread.synchronization.executors"></a><a class="link" href="synchronization.html#thread.synchronization.executors" title="Executors and Schedulers -- EXPERIMENTAL">Executors and Schedulers
9105       -- EXPERIMENTAL</a>
9106 </h3></div></div></div>
9107 <div class="toc"><dl class="toc">
9108 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.introduction">Introduction</a></span></dt>
9109 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.examples">Examples</a></span></dt>
9110 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.rationale">Design
9111         Rationale</a></span></dt>
9112 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref">Reference</a></span></dt>
9113 </dl></div>
9114 <div class="warning"><table border="0" summary="Warning">
9115 <tr>
9116 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
9117 <th align="left">Warning</th>
9118 </tr>
9119 <tr><td align="left" valign="top"><p>
9120           These features are experimental and subject to change in future versions.
9121           There are not too much tests yet, so it is possible that you can find out
9122           some trivial bugs :(
9123         </p></td></tr>
9124 </table></div>
9125 <div class="note"><table border="0" summary="Note">
9126 <tr>
9127 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
9128 <th align="left">Note</th>
9129 </tr>
9130 <tr><td align="left" valign="top"><p>
9131           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>
9132           C++1y proposal from Chris Mysen, Niklas Gustafsson, Matt Austern, Jeffrey
9133           Yasskin. The text that follows has been adapted from tis paper to show
9134           the differences.
9135         </p></td></tr>
9136 </table></div>
9137 <p>
9138         Executors are objects that can execute units of work packaged as function
9139         objects. Boost.Thread differs from N3785 mainly in the an Executor doesn't
9140         needs to inherit from an abstract class Executor. Static polymorphism is
9141         used instead and type erasure is used internally.
9142       </p>
9143 <div class="section">
9144 <div class="titlepage"><div><div><h4 class="title">
9145 <a name="thread.synchronization.executors.introduction"></a><a class="link" href="synchronization.html#thread.synchronization.executors.introduction" title="Introduction">Introduction</a>
9146 </h4></div></div></div>
9147 <p>
9148           Multithreaded programs often involve discrete (sometimes small) units of
9149           work that are executed asynchronously. This often involves passing work
9150           units to some component that manages execution. We already have boost::async,
9151           which potentially executes a function asynchronously and eventually returns
9152           its result in a future. (&#8220;As if&#8221; by launching a new thread.)
9153         </p>
9154 <p>
9155           If there is a regular stream of small work items then we almost certainly
9156           don&#8217;t want to launch a new thread for each, and it&#8217;s likely that we
9157           want at least some control over which thread(s) execute which items. It
9158           is often convenient to represent that control as multiple executor objects.
9159           This allows programs to start executors when necessary, switch from one
9160           executor to another to control execution policy, and use multiple executors
9161           to prevent interference and thread exhaustion. Several possible implementations
9162           exist of the executor class and in practice there are a number of main
9163           groups of executors which have been found to be useful in real-world code
9164           (more implementations exist, this is simply a high level classification
9165           of them). These differ along a couple main dimensions, how many execution
9166           contexts will be used, how they are selected, and how they are prioritized.
9167         </p>
9168 <div class="orderedlist"><ol class="orderedlist" type="1">
9169 <li class="listitem">
9170               Thread Pools
9171               <div class="orderedlist"><ol class="orderedlist" type="a">
9172 <li class="listitem">
9173                     Simple unbounded thread pool, which can queue up an unbounded
9174                     amount of work and maintains a dedicated set of threads (up to
9175                     some maximum) which dequeue and execute work as available.
9176                   </li>
9177 <li class="listitem">
9178                     Bounded thread pools, which can be implemented as a specialization
9179                     of the previous ones with a bounded queue or semaphore, which
9180                     limits the amount of queuing in an attempt to bound the time
9181                     spent waiting to execute and/or limit resource utilization for
9182                     work tasks which hold state which is expensive to hold.
9183                   </li>
9184 <li class="listitem">
9185                     Thread-spawning executors, in which each work always executes
9186                     in a new thread.
9187                   </li>
9188 <li class="listitem">
9189                     Prioritized thread pools, which have works which are not equally
9190                     prioritized such that work can move to the front of the execution
9191                     queue if necessary. This requires a special comparator or prioritization
9192                     function to allow for work ordering and normally is implemented
9193                     as a blocking priority queue in front of the pool instead of
9194                     a blocking queue. This has many uses but is a somewhat specialized
9195                     in nature and would unnecessarily clutter the initial interface.
9196                   </li>
9197 <li class="listitem">
9198                     Work stealing thread pools, this is a specialized use case and
9199                     is encapsulated in the ForkJoinPool in java, which allows lightweight
9200                     work to be created by tasks in the pool and either run by the
9201                     same thread for invocation efficiency or stolen by another thread
9202                     without additional work. These have been left out until there
9203                     is a more concrete fork-join proposal or until there is a more
9204                     clear need as these can be complicated to implement
9205                   </li>
9206 </ol></div>
9207             </li>
9208 <li class="listitem">
9209               Mutual exclusion executors
9210               <div class="orderedlist"><ol class="orderedlist" type="a">
9211 <li class="listitem">
9212                     Serial executors, which guarantee all work to be executed such
9213                     that no two works will execute concurrently. This allows for
9214                     a sequence of operations to be queued in sequence and that sequential
9215                     order is maintained and work can be queued on a separate thread
9216                     but with no mutual exclusion required.
9217                   </li>
9218 <li class="listitem">
9219                     Loop executor, in which one thread donates itself to the executor
9220                     to execute all queued work. This is related to the serial executor
9221                     in that it guarantees mutual exclusion, but instead guarantees
9222                     a particular thread will execute the work. These are particularly
9223                     useful for testing purposes where code assumes an executor but
9224                     testing code desires control over execution.
9225                   </li>
9226 <li class="listitem">
9227                     GUI thread executor, where a GUI framework can expose an executor
9228                     interface to allow other threads to queue up work to be executed
9229                     as part of the GUI thread. This behaves similarly to a loop executor,
9230                     but must be implemented as a custom interface as part of the
9231                     framework.
9232                   </li>
9233 </ol></div>
9234             </li>
9235 <li class="listitem">
9236               Inline executors, which execute inline to the thread which calls submit().
9237               This has no queuing and behaves like a normal executor, but always
9238               uses the caller&#8217;s thread to execute. This allows parallel execution
9239               of works, though. This type of executor is often useful when there
9240               is an executor required by an interface, but when for performance reasons
9241               it&#8217;s better not to queue work or switch threads. This is often very
9242               useful as an optimization for work continuations which should execute
9243               immediately or quickly and can also be useful for optimizations when
9244               an interface requires an executor but the work tasks are too small
9245               to justify the overhead of a full thread pool.
9246             </li>
9247 </ol></div>
9248 <p>
9249           A question arises of which of these executors (or others) be included in
9250           this library. There are use cases for these and many other executors. Often
9251           it is useful to have more than one implemented executor (e.g. the thread
9252           pool) to have more precise control of where the work is executed due to
9253           the existence of a GUI thread, or for testing purposes. A few core executors
9254           are frequently useful and these have been outlined here as the core of
9255           what should be in this library, if common use cases arise for alternative
9256           executor implementations, they can be added in the future. The current
9257           set provided here are: a basic thread pool <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code>,
9258           a serial executor <code class="computeroutput"><span class="identifier">serial_executor</span></code>,
9259           a loop executor <code class="computeroutput"><span class="identifier">loop_executor</span></code>,
9260           an inline executor <code class="computeroutput"><span class="identifier">inline_executor</span></code>
9261           and a thread-spawning executor <code class="computeroutput"><span class="identifier">thread_executor</span></code>.
9262         </p>
9263 </div>
9264 <div class="section">
9265 <div class="titlepage"><div><div><h4 class="title">
9266 <a name="thread.synchronization.executors.examples"></a><a class="link" href="synchronization.html#thread.synchronization.executors.examples" title="Examples">Examples</a>
9267 </h4></div></div></div>
9268 <div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.examples.quick_sort">Parallel
9269           Quick Sort</a></span></dt></dl></div>
9270 <div class="section">
9271 <div class="titlepage"><div><div><h5 class="title">
9272 <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
9273           Quick Sort</a>
9274 </h5></div></div></div>
9275 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
9276 <span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
9277 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">numeric</span><span class="special">&gt;</span>
9278 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">algorithm</span><span class="special">&gt;</span>
9279 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">functional</span><span class="special">&gt;</span>
9280 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
9281 <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">list</span><span class="special">&gt;</span>
9282
9283 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
9284 <span class="keyword">struct</span> <span class="identifier">sorter</span>
9285 <span class="special">{</span>
9286     <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>
9287     <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">return_type</span><span class="special">;</span>
9288
9289     <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">chunk_data</span><span class="special">)</span>
9290     <span class="special">{</span>
9291         <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>
9292             <span class="keyword">return</span> <span class="identifier">chunk_data</span><span class="special">;</span>
9293         <span class="special">}</span>
9294
9295         <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">result</span><span class="special">;</span>
9296         <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>
9297         <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</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>
9298
9299         <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">divide_point</span> <span class="special">=</span>
9300             <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>
9301                            <span class="special">[&amp;](</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">){</span><span class="keyword">return</span> <span class="identifier">val</span><span class="special">&lt;</span><span class="identifier">partition_val</span><span class="special">;});</span>
9302
9303         <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">new_lower_chunk</span><span class="special">;</span>
9304         <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>
9305                                <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>
9306         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">new_lower</span> <span class="special">=</span>
9307              <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">&amp;</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>
9308         <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
9309         <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>
9310         <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>
9311             <span class="identifier">pool</span><span class="special">.</span><span class="identifier">schedule_one_or_yield</span><span class="special">();</span>
9312         <span class="special">}</span>
9313         <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>
9314         <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
9315     <span class="special">}</span>
9316 <span class="special">};</span>
9317
9318 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
9319 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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">&lt;</span><span class="identifier">T</span><span class="special">&gt;&amp;</span> <span class="identifier">input</span><span class="special">)</span> <span class="special">{</span>
9320     <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>
9321         <span class="keyword">return</span> <span class="identifier">input</span><span class="special">;</span>
9322     <span class="special">}</span>
9323     <span class="identifier">sorter</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">;</span>
9324     <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>
9325 <span class="special">}</span>
9326 </pre>
9327 </div>
9328 </div>
9329 <div class="section">
9330 <div class="titlepage"><div><div><h4 class="title">
9331 <a name="thread.synchronization.executors.rationale"></a><a class="link" href="synchronization.html#thread.synchronization.executors.rationale" title="Design Rationale">Design
9332         Rationale</a>
9333 </h4></div></div></div>
9334 <p>
9335           The authors of Boost.Thread have taken a different approach respect to
9336           N3785. Instead of basing all the design on a abstract executor class we
9337           make executor concepts. We believe that this is the good direction as a
9338           static polymorphic executor can be seen as a dynamic polymorphic executor
9339           using a simple adaptor. We believe also that it would make the library
9340           more usable, and more convenient for users.
9341         </p>
9342 <p>
9343           The major design decisions concern deciding what a unit of work is, how
9344           to manage with units of work and time related functions in a polymorphic
9345           way.
9346         </p>
9347 <p>
9348           An Executor is an object that schedules the closures that have been submitted
9349           to it, usually asynchronously. There could be multiple models of the Executor
9350           class. Some specific design notes:
9351         </p>
9352 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9353 <li class="listitem">
9354               Thread pools are well know models of the Executor concept, and this
9355               library does indeed include a basic_thread_pool class, but other implementations
9356               also exist, including the ability to schedule work on GUI threads,
9357               scheduling work on a donor thread, as well as several specializations
9358               of thread pools.
9359             </li>
9360 <li class="listitem">
9361               The choice of which executor to use is explicit. This is important
9362               for reasons described in the Motivation section. In particular, consider
9363               the common case of an asynchronous operation that itself spawns asynchronous
9364               operations. If both operations ran on the same executor, and if that
9365               executor had a bounded number of worker threads, then we could get
9366               deadlock. Programs often deal with such issues by splitting different
9367               kinds of work between different executors.
9368             </li>
9369 <li class="listitem">
9370               Even if there could be a strong value in having a default executor,
9371               that can be used when detailed control is unnecessary, the authors
9372               don't know how to implement it in a portable and robust way.
9373             </li>
9374 <li class="listitem">
9375               The library provides Executors based on static and dynamic polymorphism.
9376               The static polymorphism interface is intended to be used on contexts
9377               that need to have the best performances. The dynamic polymorphism interface
9378               has the advantage to been able to change the executor a function is
9379               using without making it a template and is possible to pass executors
9380               across a binary interface. For some applications, the cost of an additional
9381               virtual dispatch could be almost certainly negligible compared to the
9382               other operations involved.
9383             </li>
9384 <li class="listitem">
9385               Conceptually, an executor puts closures on a queue and at some point
9386               executes them. The queue is always unbounded, so adding a closure to
9387               an executor never blocks. (Defining &#8220;never blocks&#8221; formally is
9388               challenging, but informally we just mean that submit() is an ordinary
9389               function that executes something and returns, rather than waiting for
9390               the completion of some potentially long running operation in another
9391               thread.)
9392             </li>
9393 </ul></div>
9394 <h6>
9395 <a name="thread.synchronization.executors.rationale.h0"></a>
9396           <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>
9397         </h6>
9398 <p>
9399           One important question is just what a closure is. This library has a very
9400           simple answer: a closure is a <code class="computeroutput"><span class="identifier">Callable</span></code>
9401           with no parameters and returning <code class="computeroutput"><span class="keyword">void</span></code>.
9402         </p>
9403 <p>
9404           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">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span></code> as it provides only dynamic polymorphism
9405           and states that in practice the implementation of a template based approach
9406           or another approach is impractical. The authors of this library think that
9407           the template based approach is compatible with a dynamic based approach.
9408           They give some arguments:
9409         </p>
9410 <p>
9411           The first one is that a virtual function can not be a template. This is
9412           true but it is also true that the executor interface can provide the template
9413           functions that call to the virtual public functions. Another reason they
9414           give is that "a template parameter would complicate the interface
9415           without adding any real generality. In the end an executor class is going
9416           to need some kind of type erasure to handle all the different kinds of
9417           function objects with <code class="computeroutput"><span class="keyword">void</span><span class="special">()</span></code> signature, and that&#8217;s exactly what
9418           std::function already does". We think that it is up to the executor
9419           to manage with this implementation details, not to the user.
9420         </p>
9421 <p>
9422           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
9423           is a closure that takes no arguments and returns no value. This is indeed
9424           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>
9425           taking executors as parameters the user has all what she needs.
9426         </p>
9427 <p>
9428           The third one is related to performance. They assert that "any mechanism
9429           for storing closures on an executor&#8217;s queue will have to use some form
9430           of type erasure. There&#8217;s no reason to believe that a custom closure mechanism,
9431           written just for std::executor and used nowhere else within the standard
9432           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">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span></code>". We believe that the implementation
9433           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">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span></code>. e.g. the implementation can use
9434           intrusive data to store the closure and the pointers to other nodes needed
9435           to store the closures in a given order.
9436         </p>
9437 <p>
9438           In addition <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span></code>
9439           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>
9440           could not be a Closure.
9441         </p>
9442 <h6>
9443 <a name="thread.synchronization.executors.rationale.h1"></a>
9444           <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
9445           Handled Exceptions</a>
9446         </h6>
9447 <p>
9448           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,
9449           the executor must call the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
9450           function. Note that when we combine <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code>
9451           and <code class="computeroutput"><span class="identifier">Executors</span></code>, the exception
9452           will be caught by the closure associated to the returned future, so that
9453           the exception is stored on the returned future, as for the other <code class="computeroutput"><span class="identifier">async</span></code> overloads.
9454         </p>
9455 <h6>
9456 <a name="thread.synchronization.executors.rationale.h2"></a>
9457           <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
9458           thread entry</a>
9459         </h6>
9460 <p>
9461           It is common idiom to set some thread local variable at the beginning of
9462           a thread. As Executors could instantiate threads internally these Executors
9463           shall have the ability to call a user specific function at thread entry
9464           on the executor constructor.
9465         </p>
9466 <p>
9467           For executors that don't instantiate any thread and that would use the
9468           current thread this function shall be called only for the thread calling
9469           the <code class="computeroutput"><span class="identifier">at_thread_entry</span></code> member
9470           function.
9471         </p>
9472 <h6>
9473 <a name="thread.synchronization.executors.rationale.h3"></a>
9474           <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>
9475         </h6>
9476 <p>
9477           The library does not provision yet for the ability to cancel/interrupt
9478           work, though this is a commonly requested feature.
9479         </p>
9480 <p>
9481           This could be managed externally by an additional cancelation object that
9482           can be shared between the creator of the unit of work and the unit of work.
9483         </p>
9484 <p>
9485           We can think also of a cancelable closure that could be used in a more
9486           transparent way.
9487         </p>
9488 <p>
9489           An alternative is to make async return a cancelable_task but this will
9490           need also a cancelable closure.
9491         </p>
9492 <h6>
9493 <a name="thread.synchronization.executors.rationale.h4"></a>
9494           <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
9495           executor</a>
9496         </h6>
9497 <p>
9498           The library does not provision for the ability to get the current executor,
9499           though having access to it could simplify a lot the user code.
9500         </p>
9501 <p>
9502           The reason is that the user can always use a thread_local variable and
9503           reset it using the <code class="computeroutput"><span class="identifier">at_thread_entry</span>
9504           </code> member function.
9505         </p>
9506 <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>
9507 <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>
9508 <span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">(</span>
9509         <span class="comment">// at_thread_entry</span>
9510         <span class="special">[](</span><span class="identifier">basic_thread_pool</span><span class="special">&amp;</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span>
9511                 <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>
9512         <span class="special">}</span>
9513 <span class="special">);</span>
9514 </pre>
9515 <h6>
9516 <a name="thread.synchronization.executors.rationale.h5"></a>
9517           <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
9518           executor</a>
9519         </h6>
9520 <p>
9521           The library authors share some of the concerns of the C++ standard committee
9522           (introduction of a new single shared resource, a singleton, could make
9523           it difficult to make it portable to all the environments) and that this
9524           library doesn't need to provide a default executor for the time been.
9525         </p>
9526 <p>
9527           The user can always define his default executor himself and use the <code class="computeroutput"><span class="identifier">at_thread_entry</span> </code> member function to set
9528           the default constructor.
9529         </p>
9530 <pre class="programlisting"><span class="keyword">thread_local</span> <span class="identifier">default_executor_state_type</span> <span class="identifier">default_executor_state</span><span class="special">;</span>
9531 <span class="identifier">executor</span><span class="special">*</span> <span class="identifier">default_executor</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">default_executor_state</span><span class="special">.</span><span class="identifier">default_executor</span><span class="special">();</span> <span class="special">}</span>
9532
9533 <span class="comment">// in main</span>
9534 <span class="identifier">MyDefaultExecutor</span> <span class="identifier">myDefaultExecutor</span><span class="special">(</span>
9535         <span class="comment">// at_thread_entry</span>
9536         <span class="special">[](</span><span class="identifier">MyDefaultExecutor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">)</span> <span class="special">{</span>
9537                 <span class="identifier">default_executor_state</span><span class="special">.</span><span class="identifier">set_default_executor</span><span class="special">(</span><span class="identifier">ex</span><span class="special">);</span>
9538         <span class="special">}</span>
9539 <span class="special">);</span>
9540
9541 <span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">(</span>
9542         <span class="comment">// at_thread_entry</span>
9543         <span class="special">[&amp;</span><span class="identifier">myDefaultExecutor</span><span class="special">](</span><span class="identifier">basic_thread_pool</span><span class="special">&amp;</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span>
9544                 <span class="identifier">default_executor_state</span><span class="special">.</span><span class="identifier">set_default_executor</span><span class="special">(</span><span class="identifier">myDefaultExecutor</span><span class="special">);</span>
9545         <span class="special">}</span>
9546 <span class="special">);</span>
9547 </pre>
9548 </div>
9549 <div class="section">
9550 <div class="titlepage"><div><div><h4 class="title">
9551 <a name="thread.synchronization.executors.ref"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref" title="Reference">Reference</a>
9552 </h4></div></div></div>
9553 <div class="toc"><dl class="toc">
9554 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.concept_closure">Concept
9555           <code class="computeroutput"><span class="identifier">Closure</span></code></a></span></dt>
9556 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.concept_executor">Concept
9557           <code class="computeroutput"><span class="identifier">Executor</span></code></a></span></dt>
9558 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.work">Class
9559           <code class="computeroutput"><span class="identifier">work</span></code></a></span></dt>
9560 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.executor">Class
9561           <code class="computeroutput"><span class="identifier">executor</span></code></a></span></dt>
9562 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor">Template
9563           Class <code class="computeroutput"><span class="identifier">executor_adaptor</span></code></a></span></dt>
9564 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.generic_executor_ref">Class
9565           <code class="computeroutput"><span class="identifier">generic_executor_ref</span></code></a></span></dt>
9566 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.serial_executor">Class
9567           <code class="computeroutput"><span class="identifier">serial_executor</span></code></a></span></dt>
9568 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.inline_executor">Class
9569           <code class="computeroutput"><span class="identifier">inline_executor</span></code></a></span></dt>
9570 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool">Class
9571           <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code></a></span></dt>
9572 <dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.loop_executor">Class
9573           <code class="computeroutput"><span class="identifier">loop_executor</span></code></a></span></dt>
9574 </dl></div>
9575 <div class="section">
9576 <div class="titlepage"><div><div><h5 class="title">
9577 <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
9578           <code class="computeroutput"><span class="identifier">Closure</span></code></a>
9579 </h5></div></div></div>
9580 <p>
9581             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
9582             of <code class="computeroutput"><span class="identifier">Callable</span><span class="special">(</span><span class="keyword">void</span><span class="special">())</span></code>
9583             and a model of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>/<code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
9584           </p>
9585 </div>
9586 <div class="section">
9587 <div class="titlepage"><div><div><h5 class="title">
9588 <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
9589           <code class="computeroutput"><span class="identifier">Executor</span></code></a>
9590 </h5></div></div></div>
9591 <p>
9592             The <code class="computeroutput"><span class="identifier">Executor</span></code> concept
9593             models the common operations of all the executors.
9594           </p>
9595 <p>
9596             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
9597             expressions are well-formed and have the specified semantics
9598           </p>
9599 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9600 <li class="listitem">
9601                 <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>
9602               </li>
9603 <li class="listitem">
9604                 <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>
9605               </li>
9606 <li class="listitem">
9607                 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code>
9608               </li>
9609 <li class="listitem">
9610                 <code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span>
9611                 <span class="identifier">e</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code>
9612               </li>
9613 <li class="listitem">
9614                 <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">try_executing_one</span><span class="special">();</span></code>
9615               </li>
9616 <li class="listitem">
9617                 <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>
9618               </li>
9619 </ul></div>
9620 <p>
9621             where
9622           </p>
9623 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9624 <li class="listitem">
9625                 <code class="computeroutput"><span class="identifier">e</span></code> denotes a value
9626                 of type <code class="computeroutput"><span class="identifier">E</span></code>,
9627               </li>
9628 <li class="listitem">
9629                 <code class="computeroutput"><span class="identifier">lc</span></code> denotes a lvalue
9630                 referece of type <code class="computeroutput"><span class="identifier">Closure</span></code>,
9631               </li>
9632 <li class="listitem">
9633                 <code class="computeroutput"><span class="identifier">rc</span></code> denotes a rvalue
9634                 referece of type <code class="computeroutput"><span class="identifier">Closure</span></code>
9635               </li>
9636 <li class="listitem">
9637                 <code class="computeroutput"><span class="identifier">p</span></code> denotes a value
9638                 of type <code class="computeroutput"><span class="identifier">Predicate</span></code>
9639               </li>
9640 </ul></div>
9641 <div class="section">
9642 <div class="titlepage"><div><div><h6 class="title">
9643 <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>
9644 </h6></div></div></div>
9645 <div class="variablelist">
9646 <p class="title"><b></b></p>
9647 <dl class="variablelist">
9648 <dt><span class="term">Effects:</span></dt>
9649 <dd><p>
9650                     The specified closure will be scheduled for execution at some
9651                     point in the future. If invoked closure throws an exception the
9652                     executor will call std::terminate, as is the case with threads.
9653                   </p></dd>
9654 <dt><span class="term">Synchronization:</span></dt>
9655 <dd><p>
9656                     completion of closure on a particular thread happens before destruction
9657                     of thread's thread local variables.
9658                   </p></dd>
9659 <dt><span class="term">Return type:</span></dt>
9660 <dd><p>
9661                     <code class="computeroutput"><span class="keyword">void</span></code>.
9662                   </p></dd>
9663 <dt><span class="term">Throws:</span></dt>
9664 <dd><p>
9665                     sync_queue_is_closed if the thread pool is closed. Whatever exception
9666                     that can be throw while storing the closure.
9667                   </p></dd>
9668 <dt><span class="term">Exception safety:</span></dt>
9669 <dd><p>
9670                     If an exception is thrown then the executor state is unmodified.
9671                   </p></dd>
9672 </dl>
9673 </div>
9674 </div>
9675 <div class="section">
9676 <div class="titlepage"><div><div><h6 class="title">
9677 <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(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>
9678 </h6></div></div></div>
9679 <div class="variablelist">
9680 <p class="title"><b></b></p>
9681 <dl class="variablelist">
9682 <dt><span class="term">Effects:</span></dt>
9683 <dd><p>
9684                     The specified closure will be scheduled for execution at some
9685                     point in the future. If invoked closure throws an exception the
9686                     executor will call std::terminate, as is the case with threads.
9687                   </p></dd>
9688 <dt><span class="term">Synchronization:</span></dt>
9689 <dd><p>
9690                     completion of closure on a particular thread happens before destruction
9691                     of thread's thread local variables.
9692                   </p></dd>
9693 <dt><span class="term">Return type:</span></dt>
9694 <dd><p>
9695                     <code class="computeroutput"><span class="keyword">void</span></code>.
9696                   </p></dd>
9697 <dt><span class="term">Throws:</span></dt>
9698 <dd><p>
9699                     sync_queue_is_closed if the thread pool is closed. Whatever exception
9700                     that can be throw while storing the closure.
9701                   </p></dd>
9702 <dt><span class="term">Exception safety:</span></dt>
9703 <dd><p>
9704                     If an exception is thrown then the executor state is unmodified.
9705                   </p></dd>
9706 </dl>
9707 </div>
9708 </div>
9709 <div class="section">
9710 <div class="titlepage"><div><div><h6 class="title">
9711 <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>
9712 </h6></div></div></div>
9713 <div class="variablelist">
9714 <p class="title"><b></b></p>
9715 <dl class="variablelist">
9716 <dt><span class="term">Effects:</span></dt>
9717 <dd><p>
9718                     close the executor <code class="computeroutput"><span class="identifier">e</span></code>
9719                     for submissions.
9720                   </p></dd>
9721 <dt><span class="term">Remark:</span></dt>
9722 <dd><p>
9723                     The worker threads will work until there is no more closures
9724                     to run.
9725                   </p></dd>
9726 <dt><span class="term">Return type:</span></dt>
9727 <dd><p>
9728                     <code class="computeroutput"><span class="keyword">void</span></code>.
9729                   </p></dd>
9730 <dt><span class="term">Throws:</span></dt>
9731 <dd><p>
9732                     Whatever exception that can be throw while ensuring the thread
9733                     safety.
9734                   </p></dd>
9735 <dt><span class="term">Exception safety:</span></dt>
9736 <dd><p>
9737                     If an exception is thrown then the executor state is unmodified.
9738                   </p></dd>
9739 </dl>
9740 </div>
9741 </div>
9742 <div class="section">
9743 <div class="titlepage"><div><div><h6 class="title">
9744 <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>
9745 </h6></div></div></div>
9746 <div class="variablelist">
9747 <p class="title"><b></b></p>
9748 <dl class="variablelist">
9749 <dt><span class="term">Return type:</span></dt>
9750 <dd><p>
9751                     <code class="computeroutput"><span class="keyword">bool</span></code>.
9752                   </p></dd>
9753 <dt><span class="term">Return:</span></dt>
9754 <dd><p>
9755                     whether the pool is closed for submissions.
9756                   </p></dd>
9757 <dt><span class="term">Throws:</span></dt>
9758 <dd><p>
9759                     Whatever exception that can be throw while ensuring the thread
9760                     safety.
9761                   </p></dd>
9762 </dl>
9763 </div>
9764 </div>
9765 <div class="section">
9766 <div class="titlepage"><div><div><h6 class="title">
9767 <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>
9768 </h6></div></div></div>
9769 <div class="variablelist">
9770 <p class="title"><b></b></p>
9771 <dl class="variablelist">
9772 <dt><span class="term">Effects:</span></dt>
9773 <dd><p>
9774                     try to execute one work.
9775                   </p></dd>
9776 <dt><span class="term">Remark:</span></dt>
9777 <dd><p>
9778                     whether a work has been executed.
9779                   </p></dd>
9780 <dt><span class="term">Return type:</span></dt>
9781 <dd><p>
9782                     <code class="computeroutput"><span class="keyword">bool</span></code>.
9783                   </p></dd>
9784 <dt><span class="term">Return:</span></dt>
9785 <dd><p>
9786                     Whether a work has been executed.
9787                   </p></dd>
9788 <dt><span class="term">Throws:</span></dt>
9789 <dd><p>
9790                     whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
9791                     throws.
9792                   </p></dd>
9793 </dl>
9794 </div>
9795 </div>
9796 <div class="section">
9797 <div class="titlepage"><div><div><h6 class="title">
9798 <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>
9799 </h6></div></div></div>
9800 <div class="variablelist">
9801 <p class="title"><b></b></p>
9802 <dl class="variablelist">
9803 <dt><span class="term">Requires:</span></dt>
9804 <dd><p>
9805                     This must be called from an scheduled work
9806                   </p></dd>
9807 <dt><span class="term">Effects:</span></dt>
9808 <dd><p>
9809                     reschedule works until <code class="computeroutput"><span class="identifier">p</span><span class="special">()</span></code>.
9810                   </p></dd>
9811 <dt><span class="term">Return type:</span></dt>
9812 <dd><p>
9813                     <code class="computeroutput"><span class="keyword">bool</span></code>.
9814                   </p></dd>
9815 <dt><span class="term">Return:</span></dt>
9816 <dd><p>
9817                     Whether a work has been executed.
9818                   </p></dd>
9819 <dt><span class="term">Throws:</span></dt>
9820 <dd><p>
9821                     whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
9822                     throws.
9823                   </p></dd>
9824 </dl>
9825 </div>
9826 </div>
9827 </div>
9828 <div class="section">
9829 <div class="titlepage"><div><div><h5 class="title">
9830 <a name="thread.synchronization.executors.ref.work"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.work" title="Class work">Class
9831           <code class="computeroutput"><span class="identifier">work</span></code></a>
9832 </h5></div></div></div>
9833 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">work</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
9834 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9835   <span class="keyword">typedef</span> <span class="char">'implementation_defined'</span> <span class="identifier">work</span><span class="special">;</span>
9836 <span class="special">}</span>
9837 </pre>
9838 <div class="variablelist">
9839 <p class="title"><b></b></p>
9840 <dl class="variablelist">
9841 <dt><span class="term">Requires:</span></dt>
9842 <dd><p>
9843                   work is a model of 'Closure'
9844                 </p></dd>
9845 </dl>
9846 </div>
9847 </div>
9848 <div class="section">
9849 <div class="titlepage"><div><div><h5 class="title">
9850 <a name="thread.synchronization.executors.ref.executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor" title="Class executor">Class
9851           <code class="computeroutput"><span class="identifier">executor</span></code></a>
9852 </h5></div></div></div>
9853 <p>
9854             Executor abstract base class.
9855           </p>
9856 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
9857 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9858   <span class="keyword">class</span> <span class="identifier">executor</span>
9859   <span class="special">{</span>
9860   <span class="keyword">public</span><span class="special">:</span>
9861     <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>
9862
9863     <span class="identifier">executor</span><span class="special">(</span><span class="identifier">executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9864     <span class="identifier">executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9865
9866     <span class="identifier">executor</span><span class="special">();</span>
9867     <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor</span><span class="special">()</span> <span class="special">{};</span>
9868
9869     <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>
9870     <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>
9871
9872     <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">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9873     <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">&amp;</span> <span class="identifier">closure</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9874     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
9875     <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
9876
9877     <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>
9878     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
9879     <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">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
9880   <span class="special">};</span>
9881 <span class="special">}</span>
9882 </pre>
9883 <div class="section">
9884 <div class="titlepage"><div><div><h6 class="title">
9885 <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
9886             <code class="computeroutput"><span class="identifier">executor</span><span class="special">()</span></code></a>
9887 </h6></div></div></div>
9888 <pre class="programlisting"><span class="identifier">executor</span><span class="special">();</span>
9889 </pre>
9890 <div class="variablelist">
9891 <p class="title"><b></b></p>
9892 <dl class="variablelist">
9893 <dt><span class="term">Effects:</span></dt>
9894 <dd><p>
9895                     Constructs a executor.
9896                   </p></dd>
9897 <dt><span class="term">Throws:</span></dt>
9898 <dd><p>
9899                     Nothing.
9900                   </p></dd>
9901 </dl>
9902 </div>
9903 </div>
9904 <div class="section">
9905 <div class="titlepage"><div><div><h6 class="title">
9906 <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
9907             <code class="computeroutput"><span class="special">~</span><span class="identifier">executor</span><span class="special">()</span></code></a>
9908 </h6></div></div></div>
9909 <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor</span><span class="special">();</span>
9910 </pre>
9911 <div class="variablelist">
9912 <p class="title"><b></b></p>
9913 <dl class="variablelist">
9914 <dt><span class="term">Effects:</span></dt>
9915 <dd><p>
9916                     Destroys the executor.
9917                   </p></dd>
9918 <dt><span class="term">Synchronization:</span></dt>
9919 <dd><p>
9920                     The completion of all the closures happen before the completion
9921                     of the executor destructor.
9922                   </p></dd>
9923 </dl>
9924 </div>
9925 </div>
9926 </div>
9927 <div class="section">
9928 <div class="titlepage"><div><div><h5 class="title">
9929 <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
9930           Class <code class="computeroutput"><span class="identifier">executor_adaptor</span></code></a>
9931 </h5></div></div></div>
9932 <p>
9933             Polymorphic adaptor of a model of Executor to an executor.
9934           </p>
9935 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
9936 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9937   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
9938   <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>
9939   <span class="special">{</span>
9940     <span class="identifier">Executor</span> <span class="identifier">ex</span><span class="special">;</span> <span class="comment">// for exposition only</span>
9941   <span class="keyword">public</span><span class="special">:</span>
9942     <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>
9943
9944     <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">executor_adaptor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9945     <span class="identifier">executor_adaptor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">executor_adaptor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9946
9947     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">&gt;</span>
9948     <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
9949
9950     <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
9951
9952     <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
9953     <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
9954
9955     <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
9956     <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
9957
9958     <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
9959
9960   <span class="special">};</span>
9961 <span class="special">}</span>
9962 </pre>
9963 <div class="section">
9964 <div class="titlepage"><div><div><h6 class="title">
9965 <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&amp;&amp; ...)">Constructor
9966             <code class="computeroutput"><span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;</span>
9967             <span class="special">...)</span></code></a>
9968 </h6></div></div></div>
9969 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">&gt;</span>
9970 <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
9971 </pre>
9972 <div class="variablelist">
9973 <p class="title"><b></b></p>
9974 <dl class="variablelist">
9975 <dt><span class="term">Effects:</span></dt>
9976 <dd><p>
9977                     Constructs a executor_adaptor.
9978                   </p></dd>
9979 <dt><span class="term">Throws:</span></dt>
9980 <dd><p>
9981                     Nothing.
9982                   </p></dd>
9983 </dl>
9984 </div>
9985 </div>
9986 <div class="section">
9987 <div class="titlepage"><div><div><h6 class="title">
9988 <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
9989             <code class="computeroutput"><span class="special">~</span><span class="identifier">executor_adaptor</span><span class="special">()</span></code></a>
9990 </h6></div></div></div>
9991 <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor_adaptor</span><span class="special">();</span>
9992 </pre>
9993 <div class="variablelist">
9994 <p class="title"><b></b></p>
9995 <dl class="variablelist">
9996 <dt><span class="term">Effects:</span></dt>
9997 <dd><p>
9998                     Destroys the executor_adaptor.
9999                   </p></dd>
10000 <dt><span class="term">Synchronization:</span></dt>
10001 <dd><p>
10002                     The completion of all the closures happen before the completion
10003                     of the executor destructor.
10004                   </p></dd>
10005 </dl>
10006 </div>
10007 </div>
10008 <div class="section">
10009 <div class="titlepage"><div><div><h6 class="title">
10010 <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
10011             member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a>
10012 </h6></div></div></div>
10013 <pre class="programlisting"><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
10014 </pre>
10015 <div class="variablelist">
10016 <p class="title"><b></b></p>
10017 <dl class="variablelist">
10018 <dt><span class="term">Return:</span></dt>
10019 <dd><p>
10020                     The underlying executor instance.
10021                   </p></dd>
10022 <dt><span class="term">Throws:</span></dt>
10023 <dd><p>
10024                     Nothing.
10025                   </p></dd>
10026 </dl>
10027 </div>
10028 </div>
10029 </div>
10030 <div class="section">
10031 <div class="titlepage"><div><div><h5 class="title">
10032 <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
10033           <code class="computeroutput"><span class="identifier">generic_executor_ref</span></code></a>
10034 </h5></div></div></div>
10035 <p>
10036             Executor abstract base class.
10037           </p>
10038 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">generic_executor_ref</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10039 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10040   <span class="keyword">class</span> <span class="identifier">generic_executor_ref</span>
10041   <span class="special">{</span>
10042   <span class="keyword">public</span><span class="special">:</span>
10043     <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">&amp;);</span>
10044     <span class="identifier">generic_executor_ref</span><span class="special">&amp;</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">&amp;);</span>
10045
10046     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
10047     <span class="identifier">executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
10048     <span class="identifier">generic_executor_ref</span><span class="special">()</span> <span class="special">{};</span>
10049
10050     <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>
10051     <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>
10052
10053     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10054     <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
10055
10056     <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>
10057     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
10058     <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">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
10059   <span class="special">};</span>
10060 <span class="special">}</span>
10061 </pre>
10062 </div>
10063 <div class="section">
10064 <div class="titlepage"><div><div><h5 class="title">
10065 <a name="thread.synchronization.executors.ref.serial_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor" title="Class serial_executor">Class
10066           <code class="computeroutput"><span class="identifier">serial_executor</span></code></a>
10067 </h5></div></div></div>
10068 <p>
10069             A serial executor ensuring that there are no two work units that executes
10070             concurrently.
10071           </p>
10072 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">serial_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10073 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10074   <span class="keyword">class</span> <span class="identifier">serial_executor</span>
10075   <span class="special">{</span>
10076   <span class="keyword">public</span><span class="special">:</span>
10077     <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">serial_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10078     <span class="identifier">serial_executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">serial_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10079
10080     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
10081     <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
10082
10083     <span class="identifier">generic_executor_ref</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
10084
10085     <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10086     <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10087
10088     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10089     <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
10090
10091     <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10092     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
10093     <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">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
10094
10095   <span class="special">};</span>
10096 <span class="special">}</span>
10097 </pre>
10098 <div class="section">
10099 <div class="titlepage"><div><div><h6 class="title">
10100 <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&amp;)">Constructor
10101             <code class="computeroutput"><span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&amp;)</span></code></a>
10102 </h6></div></div></div>
10103 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
10104 <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
10105 </pre>
10106 <div class="variablelist">
10107 <p class="title"><b></b></p>
10108 <dl class="variablelist">
10109 <dt><span class="term">Effects:</span></dt>
10110 <dd><p>
10111                     Constructs a serial_executor.
10112                   </p></dd>
10113 <dt><span class="term">Throws:</span></dt>
10114 <dd><p>
10115                     Nothing.
10116                   </p></dd>
10117 </dl>
10118 </div>
10119 </div>
10120 <div class="section">
10121 <div class="titlepage"><div><div><h6 class="title">
10122 <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
10123             <code class="computeroutput"><span class="special">~</span><span class="identifier">serial_executor</span><span class="special">()</span></code></a>
10124 </h6></div></div></div>
10125 <pre class="programlisting"><span class="special">~</span><span class="identifier">serial_executor</span><span class="special">();</span>
10126 </pre>
10127 <div class="variablelist">
10128 <p class="title"><b></b></p>
10129 <dl class="variablelist">
10130 <dt><span class="term">Effects:</span></dt>
10131 <dd><p>
10132                     Destroys the serial_executor.
10133                   </p></dd>
10134 <dt><span class="term">Synchronization:</span></dt>
10135 <dd><p>
10136                     The completion of all the closures happen before the completion
10137                     of the executor destructor.
10138                   </p></dd>
10139 </dl>
10140 </div>
10141 </div>
10142 <div class="section">
10143 <div class="titlepage"><div><div><h6 class="title">
10144 <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
10145             member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a>
10146 </h6></div></div></div>
10147 <pre class="programlisting"><span class="identifier">generic_executor_ref</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
10148 </pre>
10149 <div class="variablelist">
10150 <p class="title"><b></b></p>
10151 <dl class="variablelist">
10152 <dt><span class="term">Return:</span></dt>
10153 <dd><p>
10154                     The underlying executor instance.
10155                   </p></dd>
10156 <dt><span class="term">Throws:</span></dt>
10157 <dd><p>
10158                     Nothing.
10159                   </p></dd>
10160 </dl>
10161 </div>
10162 </div>
10163 </div>
10164 <div class="section">
10165 <div class="titlepage"><div><div><h5 class="title">
10166 <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
10167           <code class="computeroutput"><span class="identifier">inline_executor</span></code></a>
10168 </h5></div></div></div>
10169 <p>
10170             A serial executor ensuring that there are no two work units that executes
10171             concurrently.
10172           </p>
10173 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">inline_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10174 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10175   <span class="keyword">class</span> <span class="identifier">inline_executor</span>
10176   <span class="special">{</span>
10177   <span class="keyword">public</span><span class="special">:</span>
10178     <span class="identifier">inline_executor</span><span class="special">(</span><span class="identifier">inline_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10179     <span class="identifier">inline_executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">inline_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10180
10181     <span class="identifier">inline_executor</span><span class="special">();</span>
10182
10183     <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10184     <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10185
10186     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10187     <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
10188
10189     <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10190     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
10191     <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">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
10192
10193   <span class="special">};</span>
10194 <span class="special">}</span>
10195 </pre>
10196 <div class="section">
10197 <div class="titlepage"><div><div><h6 class="title">
10198 <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
10199             <code class="computeroutput"><span class="identifier">inline_executor</span><span class="special">()</span></code></a>
10200 </h6></div></div></div>
10201 <pre class="programlisting"><span class="identifier">inline_executor</span><span class="special">();</span>
10202 </pre>
10203 <div class="variablelist">
10204 <p class="title"><b></b></p>
10205 <dl class="variablelist">
10206 <dt><span class="term">Effects:</span></dt>
10207 <dd><p>
10208                     Constructs a inline_executor.
10209                   </p></dd>
10210 <dt><span class="term">Throws:</span></dt>
10211 <dd><p>
10212                     Nothing.
10213                   </p></dd>
10214 </dl>
10215 </div>
10216 </div>
10217 <div class="section">
10218 <div class="titlepage"><div><div><h6 class="title">
10219 <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
10220             <code class="computeroutput"><span class="special">~</span><span class="identifier">inline_executor</span><span class="special">()</span></code></a>
10221 </h6></div></div></div>
10222 <pre class="programlisting"><span class="special">~</span><span class="identifier">inline_executor</span><span class="special">();</span>
10223 </pre>
10224 <div class="variablelist">
10225 <p class="title"><b></b></p>
10226 <dl class="variablelist">
10227 <dt><span class="term">Effects:</span></dt>
10228 <dd><p>
10229                     Destroys the inline_executor.
10230                   </p></dd>
10231 <dt><span class="term">Synchronization:</span></dt>
10232 <dd><p>
10233                     The completion of all the closures happen before the completion
10234                     of the executor destructor.
10235                   </p></dd>
10236 </dl>
10237 </div>
10238 </div>
10239 </div>
10240 <div class="section">
10241 <div class="titlepage"><div><div><h5 class="title">
10242 <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
10243           <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code></a>
10244 </h5></div></div></div>
10245 <p>
10246             A thread pool with up to a fixed number of threads.
10247           </p>
10248 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">work</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10249 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10250   <span class="keyword">class</span> <span class="identifier">basic_thread_pool</span>
10251   <span class="special">{</span>
10252   <span class="keyword">public</span><span class="special">:</span>
10253
10254     <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">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10255     <span class="identifier">basic_thread_pool</span><span class="special">&amp;</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">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10256
10257     <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>
10258     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AtThreadEntry</span><span class="special">&gt;</span>
10259     <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>
10260     <span class="special">~</span><span class="identifier">basic_thread_pool</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="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10266     <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
10267
10268     <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10269
10270     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
10271     <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">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
10272
10273   <span class="special">};</span>
10274 <span class="special">}</span>
10275 </pre>
10276 <div class="section">
10277 <div class="titlepage"><div><div><h6 class="title">
10278 <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
10279             <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>
10280 </h6></div></div></div>
10281 <div class="variablelist">
10282 <p class="title"><b></b></p>
10283 <dl class="variablelist">
10284 <dt><span class="term">Effects:</span></dt>
10285 <dd><p>
10286                     creates a thread pool that runs closures on <code class="computeroutput"><span class="identifier">thread_count</span></code>
10287                     threads.
10288                   </p></dd>
10289 <dt><span class="term">Throws:</span></dt>
10290 <dd><p>
10291                     Whatever exception is thrown while initializing the needed resources.
10292                   </p></dd>
10293 </dl>
10294 </div>
10295 </div>
10296 <div class="section">
10297 <div class="titlepage"><div><div><h6 class="title">
10298 <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
10299             <code class="computeroutput"><span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">()</span></code></a>
10300 </h6></div></div></div>
10301 <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">();</span>
10302 </pre>
10303 <div class="variablelist">
10304 <p class="title"><b></b></p>
10305 <dl class="variablelist">
10306 <dt><span class="term">Effects:</span></dt>
10307 <dd><p>
10308                     Destroys the thread pool.
10309                   </p></dd>
10310 <dt><span class="term">Synchronization:</span></dt>
10311 <dd><p>
10312                     The completion of all the closures happen before the completion
10313                     of the executor destructor.
10314                   </p></dd>
10315 </dl>
10316 </div>
10317 </div>
10318 </div>
10319 <div class="section">
10320 <div class="titlepage"><div><div><h5 class="title">
10321 <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
10322           <code class="computeroutput"><span class="identifier">loop_executor</span></code></a>
10323 </h5></div></div></div>
10324 <p>
10325             A user scheduled executor.
10326           </p>
10327 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">loop_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10328 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10329   <span class="keyword">class</span> <span class="identifier">loop_executor</span>
10330   <span class="special">{</span>
10331   <span class="keyword">public</span><span class="special">:</span>
10332
10333     <span class="identifier">loop_executor</span><span class="special">(</span><span class="identifier">loop_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10334     <span class="identifier">loop_executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">loop_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10335
10336     <span class="identifier">loop_executor</span><span class="special">();</span>
10337     <span class="special">~</span><span class="identifier">loop_executor</span><span class="special">();</span>
10338
10339     <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10340     <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10341
10342     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10343     <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">Closure</span><span class="special">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
10344
10345     <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10346     <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
10347     <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">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
10348
10349     <span class="keyword">void</span> <span class="identifier">loop</span><span class="special">();</span>
10350     <span class="keyword">void</span> <span class="identifier">run_queued_closures</span><span class="special">();</span>
10351   <span class="special">};</span>
10352 <span class="special">}</span>
10353 </pre>
10354 <div class="section">
10355 <div class="titlepage"><div><div><h6 class="title">
10356 <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
10357             <code class="computeroutput"><span class="identifier">loop_executor</span><span class="special">()</span></code></a>
10358 </h6></div></div></div>
10359 <pre class="programlisting"><span class="identifier">loop_executor</span><span class="special">();</span>
10360 </pre>
10361 <div class="variablelist">
10362 <p class="title"><b></b></p>
10363 <dl class="variablelist">
10364 <dt><span class="term">Effects:</span></dt>
10365 <dd><p>
10366                     creates a executor that runs closures using one of its closure-executing
10367                     methods.
10368                   </p></dd>
10369 <dt><span class="term">Throws:</span></dt>
10370 <dd><p>
10371                     Whatever exception is thrown while initializing the needed resources.
10372                   </p></dd>
10373 </dl>
10374 </div>
10375 </div>
10376 <div class="section">
10377 <div class="titlepage"><div><div><h6 class="title">
10378 <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
10379             <code class="computeroutput"><span class="special">~</span><span class="identifier">loop_executor</span><span class="special">()</span></code></a>
10380 </h6></div></div></div>
10381 <pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">loop_executor</span><span class="special">();</span>
10382 </pre>
10383 <div class="variablelist">
10384 <p class="title"><b></b></p>
10385 <dl class="variablelist">
10386 <dt><span class="term">Effects:</span></dt>
10387 <dd><p>
10388                     Destroys the executor.
10389                   </p></dd>
10390 <dt><span class="term">Synchronization:</span></dt>
10391 <dd><p>
10392                     The completion of all the closures happen before the completion
10393                     of the executor destructor.
10394                   </p></dd>
10395 </dl>
10396 </div>
10397 </div>
10398 <div class="section">
10399 <div class="titlepage"><div><div><h6 class="title">
10400 <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
10401             member <code class="computeroutput"><span class="identifier">loop</span><span class="special">()</span></code></a>
10402 </h6></div></div></div>
10403 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">loop</span><span class="special">();</span>
10404 </pre>
10405 <div class="variablelist">
10406 <p class="title"><b></b></p>
10407 <dl class="variablelist">
10408 <dt><span class="term">Return:</span></dt>
10409 <dd><p>
10410                     reschedule works until <code class="computeroutput"><span class="identifier">closed</span><span class="special">()</span></code> or empty.
10411                   </p></dd>
10412 <dt><span class="term">Throws:</span></dt>
10413 <dd><p>
10414                     whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
10415                     throws.
10416                   </p></dd>
10417 </dl>
10418 </div>
10419 </div>
10420 <div class="section">
10421 <div class="titlepage"><div><div><h6 class="title">
10422 <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
10423             member <code class="computeroutput"><span class="identifier">run_queued_closures</span><span class="special">()</span></code></a>
10424 </h6></div></div></div>
10425 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">run_queued_closures</span><span class="special">();</span>
10426 </pre>
10427 <div class="variablelist">
10428 <p class="title"><b></b></p>
10429 <dl class="variablelist">
10430 <dt><span class="term">Return:</span></dt>
10431 <dd><p>
10432                     reschedule the enqueued works.
10433                   </p></dd>
10434 <dt><span class="term">Throws:</span></dt>
10435 <dd><p>
10436                     whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
10437                     throws.
10438                   </p></dd>
10439 </dl>
10440 </div>
10441 </div>
10442 </div>
10443 </div>
10444 </div>
10445 <div class="section">
10446 <div class="titlepage"><div><div><h3 class="title">
10447 <a name="thread.synchronization.futures"></a><a class="link" href="synchronization.html#thread.synchronization.futures" title="Futures">Futures</a>
10448 </h3></div></div></div>
10449 <div class="toc"><dl class="toc">
10450 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.overview">Overview</a></span></dt>
10451 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.creating">Creating asynchronous
10452         values</a></span></dt>
10453 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.lazy_futures">Wait Callbacks
10454         and Lazy Futures</a></span></dt>
10455 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.at_thread_exit">Handling
10456         Detached Threads and Thread Specific Variables</a></span></dt>
10457 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.async">Executing asynchronously</a></span></dt>
10458 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.shared">Shared Futures</a></span></dt>
10459 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.make_ready_future">Making
10460         immediate futures easier</a></span></dt>
10461 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.then">Associating future
10462         continuations</a></span></dt>
10463 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference">Futures Reference</a></span></dt>
10464 </dl></div>
10465 <div class="section">
10466 <div class="titlepage"><div><div><h4 class="title">
10467 <a name="thread.synchronization.futures.overview"></a><a class="link" href="synchronization.html#thread.synchronization.futures.overview" title="Overview">Overview</a>
10468 </h4></div></div></div>
10469 <p>
10470           The futures library provides a means of handling synchronous future values,
10471           whether those values are generated by another thread, or on a single thread
10472           in response to external stimuli, or on-demand.
10473         </p>
10474 <p>
10475           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
10476           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
10477           generate the asynchronous results.
10478         </p>
10479 <p>
10480           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
10481           reference to a result. Ownership can be transferred between instances using
10482           the move constructor or move-assignment operator, but at most one instance
10483           holds a reference to a given asynchronous result. When the result is ready,
10484           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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code></a>
10485           by rvalue-reference to allow the result to be moved or copied as appropriate
10486           for the type.
10487         </p>
10488 <p>
10489           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
10490           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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code></a>
10491           returns a non <code class="computeroutput"><span class="keyword">const</span></code> reference
10492           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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code></a>
10493           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
10494           ownership of the associated asynchronous result, but not vice-versa.
10495         </p>
10496 <p>
10497           <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
10498           tasks. A call to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code>
10499           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
10500           of the task.
10501         </p>
10502 <p>
10503           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>
10504           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>
10505           functions.
10506         </p>
10507 </div>
10508 <div class="section">
10509 <div class="titlepage"><div><div><h4 class="title">
10510 <a name="thread.synchronization.futures.creating"></a><a class="link" href="synchronization.html#thread.synchronization.futures.creating" title="Creating asynchronous values">Creating asynchronous
10511         values</a>
10512 </h4></div></div></div>
10513 <p>
10514           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
10515           that wraps a function or callable object. When the packaged task is invoked,
10516           it invokes the contained function in turn, and populates a future with
10517           the return value. This is an answer to the perennial question: "how
10518           do I return a value from a thread?": package the function you wish
10519           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
10520           task to the thread constructor. The future retrieved from the packaged
10521           task can then be used to obtain the return value. If the function throws
10522           an exception, that is stored in the future in place of the return value.
10523         </p>
10524 <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>
10525 <span class="special">{</span>
10526     <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span>
10527 <span class="special">}</span>
10528
10529 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</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>
10530 <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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</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>
10531
10532 <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>
10533
10534 <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>
10535
10536 <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>
10537 <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>
10538 <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>
10539 <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>
10540 <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>
10541 </pre>
10542 <p>
10543           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:
10544           it just provides explicit functions to store a value or an exception in
10545           the associated future. A promise can therefore be used where the value
10546           may come from more than one possible source, or where a single operation
10547           may produce multiple values.
10548         </p>
10549 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">pi</span><span class="special">;</span>
10550 <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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">fi</span><span class="special">;</span>
10551 <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>
10552
10553 <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>
10554
10555 <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>
10556 <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>
10557 <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>
10558 <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>
10559 <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>
10560 </pre>
10561 </div>
10562 <div class="section">
10563 <div class="titlepage"><div><div><h4 class="title">
10564 <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
10565         and Lazy Futures</a>
10566 </h4></div></div></div>
10567 <p>
10568           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
10569           callbacks</em></span> that are invoked when a thread blocks in a call to
10570           <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
10571           or <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
10572           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
10573           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.
10574         </p>
10575 <p>
10576           This allows <span class="emphasis"><em>lazy futures</em></span> where the result is not actually
10577           computed until it is needed by some thread. In the example below, the call
10578           to <code class="computeroutput"><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>
10579           invokes the callback <code class="computeroutput"><span class="identifier">invoke_lazy_task</span></code>,
10580           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.
10581         </p>
10582 <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>
10583 <span class="special">{</span>
10584     <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span>
10585 <span class="special">}</span>
10586
10587 <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">&lt;</span><span class="keyword">int</span><span class="special">&gt;&amp;</span> <span class="identifier">task</span><span class="special">)</span>
10588 <span class="special">{</span>
10589     <span class="keyword">try</span>
10590     <span class="special">{</span>
10591         <span class="identifier">task</span><span class="special">();</span>
10592     <span class="special">}</span>
10593     <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">&amp;)</span>
10594     <span class="special">{}</span>
10595 <span class="special">}</span>
10596
10597 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
10598 <span class="special">{</span>
10599     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</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>
10600     <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>
10601     <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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</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>
10602
10603     <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>
10604 <span class="special">}</span>
10605 </pre>
10606 </div>
10607 <div class="section">
10608 <div class="titlepage"><div><div><h4 class="title">
10609 <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
10610         Detached Threads and Thread Specific Variables</a>
10611 </h4></div></div></div>
10612 <p>
10613           Detached threads pose a problem for objects with thread storage duration.
10614           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>
10615           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 -
10616           such as waiting for a future to be ready - then the destructors of thread
10617           specific variables will still be running after the waiting thread has resumed.
10618           This section explain how the standard mechanism can be used to make such
10619           synchronization safe by ensuring that the objects with thread storage duration
10620           are destroyed prior to the future being made ready. e.g.
10621         </p>
10622 <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>
10623 <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">&lt;</span><span class="keyword">int</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">p</span><span class="special">)</span>
10624 <span class="special">{</span>
10625     <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>
10626 <span class="special">}</span>
10627
10628 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
10629 <span class="special">{</span>
10630     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">p</span><span class="special">;</span>
10631     <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>
10632     <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>
10633     <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</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">()&lt;&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
10634 <span class="special">}</span>
10635 </pre>
10636 <p>
10637           When the call to <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
10638           returns, we know that not only is the future value ready, but the thread
10639           specific variables on the other thread have also been destroyed.
10640         </p>
10641 <p>
10642           Such mechanisms are provided for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span></code>,
10643           <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>.
10644           e.g.
10645         </p>
10646 <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">&lt;</span><span class="keyword">void</span><span class="special">(</span><span class="keyword">int</span><span class="special">)&gt;</span> <span class="identifier">task</span><span class="special">,</span><span class="keyword">int</span> <span class="identifier">param</span><span class="special">)</span>
10647 <span class="special">{</span>
10648     <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>
10649 <span class="special">}</span> <span class="comment">// destroy thread specific and wake threads waiting on futures from task</span>
10650 </pre>
10651 <p>
10652           Other threads can wait on a future obtained from the task without having
10653           to worry about races due to the execution of destructors of the thread
10654           specific objects from the task's thread.
10655         </p>
10656 <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>
10657 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span>
10658 <span class="identifier">complex_type</span> <span class="identifier">the_data</span><span class="special">;</span>
10659 <span class="keyword">bool</span> <span class="identifier">data_ready</span><span class="special">;</span>
10660
10661 <span class="keyword">void</span> <span class="identifier">thread_func</span><span class="special">()</span>
10662 <span class="special">{</span>
10663     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">lk</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span>
10664     <span class="identifier">the_data</span><span class="special">=</span><span class="identifier">find_the_answer</span><span class="special">();</span>
10665     <span class="identifier">data_ready</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
10666     <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>
10667 <span class="special">}</span> <span class="comment">// destroy thread specific objects, notify cv, unlock mutex</span>
10668
10669 <span class="keyword">void</span> <span class="identifier">waiting_thread</span><span class="special">()</span>
10670 <span class="special">{</span>
10671     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">lk</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span>
10672     <span class="keyword">while</span><span class="special">(!</span><span class="identifier">data_ready</span><span class="special">)</span>
10673     <span class="special">{</span>
10674         <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>
10675     <span class="special">}</span>
10676     <span class="identifier">process</span><span class="special">(</span><span class="identifier">the_data</span><span class="special">);</span>
10677 <span class="special">}</span>
10678 </pre>
10679 <p>
10680           The waiting thread is guaranteed that the thread specific objects used
10681           by <code class="computeroutput"><span class="identifier">thread_func</span><span class="special">()</span></code>
10682           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
10683           <code class="computeroutput"><span class="identifier">data_ready</span></code> and before calling
10684           <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>
10685           then this does NOT hold, since the thread may return from the wait due
10686           to a spurious wake-up.
10687         </p>
10688 </div>
10689 <div class="section">
10690 <div class="titlepage"><div><div><h4 class="title">
10691 <a name="thread.synchronization.futures.async"></a><a class="link" href="synchronization.html#thread.synchronization.futures.async" title="Executing asynchronously">Executing asynchronously</a>
10692 </h4></div></div></div>
10693 <p>
10694           <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
10695           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>
10696           that will contain the result of the task. Depending on the launch policy,
10697           the task is either run asynchronously on its own thread or synchronously
10698           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>.
10699         </p>
10700 <p>
10701           A launch policy of either boost::launch::async, which asks the runtime
10702           to create an asynchronous thread, or boost::launch::deferred, which indicates
10703           you simply want to defer the function call until a later time (lazy evaluation).
10704           This argument is optional - if you omit it your function will use the default
10705           policy.
10706         </p>
10707 <p>
10708           For example, consider computing the sum of a very large array. The first
10709           task is to not compute asynchronously when the overhead would be significant.
10710           The second task is to split the work into two pieces, one executed by the
10711           host thread and one executed asynchronously.
10712         </p>
10713 <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>
10714 <span class="special">{</span>
10715   <span class="keyword">int</span> <span class="identifier">sum</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
10716   <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">size</span> <span class="special">&lt;</span> <span class="number">1000</span> <span class="special">)</span>
10717     <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">&lt;</span> <span class="identifier">size</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span>
10718       <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>
10719   <span class="keyword">else</span> <span class="special">{</span>
10720     <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>
10721     <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>
10722     <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>
10723   <span class="special">}</span>
10724   <span class="keyword">return</span> <span class="identifier">sum</span><span class="special">;</span>
10725 <span class="special">}</span>
10726 </pre>
10727 </div>
10728 <div class="section">
10729 <div class="titlepage"><div><div><h4 class="title">
10730 <a name="thread.synchronization.futures.shared"></a><a class="link" href="synchronization.html#thread.synchronization.futures.shared" title="Shared Futures">Shared Futures</a>
10731 </h4></div></div></div>
10732 <p>
10733           <code class="computeroutput"><span class="identifier">shared_future</span></code> is designed
10734           to be shared between threads, that is to allow multiple concurrent get
10735           operations.
10736         </p>
10737 <h6>
10738 <a name="thread.synchronization.futures.shared.h0"></a>
10739           <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>
10740         </h6>
10741 <p>
10742           The second <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
10743           call in the following example is undefined.
10744         </p>
10745 <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>
10746
10747   <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>
10748     <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
10749     <span class="special">{</span>
10750         <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>
10751     <span class="special">}</span> <span class="keyword">else</span>
10752     <span class="special">{</span>
10753         <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>
10754     <span class="special">}</span>
10755     <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>
10756 <span class="special">}</span>
10757 </pre>
10758 <p>
10759           Using a <code class="computeroutput"><span class="identifier">shared_future</span></code> solves
10760           the issue
10761         </p>
10762 <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>
10763
10764    <span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">type</span><span class="special">&gt;</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>
10765     <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
10766     <span class="special">{</span>
10767         <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>
10768     <span class="special">}</span> <span class="keyword">else</span>
10769     <span class="special">{</span>
10770         <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>
10771     <span class="special">}</span>
10772     <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>
10773 <span class="special">}</span>
10774 </pre>
10775 <h6>
10776 <a name="thread.synchronization.futures.shared.h1"></a>
10777           <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>
10778         </h6>
10779 <p>
10780           Namming the return type when declaring the <code class="computeroutput"><span class="identifier">shared_future</span></code>
10781           is needed; auto is not available within template argument lists. Here
10782           <code class="computeroutput"><span class="identifier">share</span><span class="special">()</span></code>
10783           could be used to simplify the code
10784         </p>
10785 <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>
10786
10787    <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>
10788     <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
10789     <span class="special">{</span>
10790         <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>
10791     <span class="special">}</span> <span class="keyword">else</span>
10792     <span class="special">{</span>
10793         <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>
10794     <span class="special">}</span>
10795     <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>
10796 <span class="special">}</span>
10797 </pre>
10798 <h6>
10799 <a name="thread.synchronization.futures.shared.h2"></a>
10800           <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
10801           on get()</a>
10802         </h6>
10803 <p>
10804           The user can either read or write the future avariable.
10805         </p>
10806 <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>
10807
10808    <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>
10809     <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
10810     <span class="special">{</span>
10811         <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>
10812     <span class="special">}</span> <span class="keyword">else</span>
10813     <span class="special">{</span>
10814       <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond2</span> <span class="special">)</span>
10815         <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>
10816       <span class="keyword">else</span>
10817         <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>
10818     <span class="special">}</span>
10819     <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>
10820 <span class="special">}</span>
10821 </pre>
10822 <p>
10823           This works because the <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;&gt;::</span><span class="identifier">get</span><span class="special">()</span></code> function returns a non-const reference
10824           to the appropriate storage. Of course the access to this storage must be
10825           ensured by the user. The library doesn't ensure the access to the internal
10826           storage is thread safe.
10827         </p>
10828 <p>
10829           There has been some work by the C++ standard committe 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 is thread_safe,
10830           and a <code class="computeroutput"><span class="identifier">shared_future</span></code> that
10831           can be shared between several threads, but there were not enough consensus
10832           and time to get it ready for C++11.
10833         </p>
10834 </div>
10835 <div class="section">
10836 <div class="titlepage"><div><div><h4 class="title">
10837 <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
10838         immediate futures easier</a>
10839 </h4></div></div></div>
10840 <p>
10841           Some functions may know the value at the point of construction. In these
10842           cases the value is immediately available, but needs to be returned as a
10843           future or shared_future. By using make_ready_future a future can be created
10844           which holds a pre-computed result in its shared state.
10845         </p>
10846 <p>
10847           Without these features it is non-trivial to create a future directly from
10848           a value. First a promise must be created, then the promise is set, and
10849           lastly the future is retrieved from the promise. This can now be done with
10850           one operation.
10851         </p>
10852 <h6>
10853 <a name="thread.synchronization.futures.make_ready_future.h0"></a>
10854           <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>
10855         </h6>
10856 <p>
10857           This function creates a future for a given value. If no value is given
10858           then a future&lt;void&gt; is returned. This function is primarily useful
10859           in cases where sometimes, the return value is immediately available, but
10860           sometimes it is not. The example below illustrates, that in an error path
10861           the value is known immediately, however in other paths the function must
10862           return an eventual value represented as a future.
10863         </p>
10864 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">compute</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span>
10865 <span class="special">{</span>
10866   <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>
10867   <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">&lt;</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">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</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>
10868   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</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>
10869   <span class="keyword">return</span> <span class="identifier">f1</span><span class="special">;</span>
10870 <span class="special">}</span>
10871 </pre>
10872 <p>
10873           There are two variations of this function. The first takes a value of any
10874           type, and returns a future of that type. The input value is passed to the
10875           shared state of the returned future. The second version takes no input
10876           and returns a future&lt;void&gt;.
10877         </p>
10878 </div>
10879 <div class="section">
10880 <div class="titlepage"><div><div><h4 class="title">
10881 <a name="thread.synchronization.futures.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.then" title="Associating future continuations">Associating future
10882         continuations</a>
10883 </h4></div></div></div>
10884 <p>
10885           In asynchronous programming, it is very common for one asynchronous operation,
10886           on completion, to invoke a second operation and pass data to it. The current
10887           C++ standard does not allow one to register a continuation to a future.
10888           With <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code>,
10889           instead of waiting for the result, a continuation is "attached"
10890           to the asynchronous operation, which is invoked when the result is ready.
10891           Continuations registered using the <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code> function will help to avoid blocking
10892           waits or wasting threads on polling, greatly improving the responsiveness
10893           and scalability of an application.
10894         </p>
10895 <p>
10896           <code class="computeroutput"><span class="identifier">future</span><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>
10897           provides the ability to sequentially compose two futures by declaring one
10898           to be the continuation of another. With <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>
10899           the antecedent future is ready (has a value or exception stored in the
10900           shared state) before the continuation starts as instructed by the lambda
10901           function.
10902         </p>
10903 <p>
10904           In the example below the <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span></code> <code class="computeroutput"><span class="identifier">f2</span></code>
10905           is registered to be a continuation of <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code> <code class="computeroutput"><span class="identifier">f1</span></code>
10906           using the <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code> member function. This operation takes
10907           a lambda function which describes how <code class="computeroutput"><span class="identifier">f2</span></code>
10908           should proceed after <code class="computeroutput"><span class="identifier">f1</span></code>
10909           is ready.
10910         </p>
10911 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
10912 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
10913 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
10914 <span class="special">{</span>
10915   <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</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>
10916   <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</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>
10917 <span class="special">}</span>
10918 </pre>
10919 <p>
10920           One key feature of this function is the ability to chain multiple asynchronous
10921           operations. In asynchronous programming, it's common to define a sequence
10922           of operations, in which each continuation executes only when the previous
10923           one completes. In some cases, the antecedent future produces a value that
10924           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
10925           straightforward and intuitive:
10926         </p>
10927 <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>
10928 </pre>
10929 <p>
10930           Some points to note are:
10931         </p>
10932 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
10933 <li class="listitem">
10934               Each continuation will not begin until the preceding has completed.
10935             </li>
10936 <li class="listitem">
10937               If an exception is thrown, the following continuation can handle it
10938               in a try-catch block
10939             </li>
10940 </ul></div>
10941 <p>
10942           Input Parameters:
10943         </p>
10944 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
10945 <li class="listitem">
10946               Lambda function: One option which can be considered is to take two
10947               functions, one for success and one for error handling. However this
10948               option has not been retained for the moment. The lambda function takes
10949               a future as its input which carries the exception through. This makes
10950               propagating exceptions straightforward. This approach also simplifies
10951               the chaining of continuations.
10952             </li>
10953 <li class="listitem">
10954               Scheduler: Providing an overload to <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code>, to take a scheduler reference
10955               places great flexibility over the execution of the future in the programmer's
10956               hand. As described above, often taking a launch policy is not sufficient
10957               for powerful asynchronous operations. The lifetime of the scheduler
10958               must outlive the continuation.
10959             </li>
10960 <li class="listitem">
10961               Launch policy: if the additional flexibility that the scheduler provides
10962               is not required.
10963             </li>
10964 </ul></div>
10965 <p>
10966           Return values: The decision to return a future was based primarily on the
10967           ability to chain multiple continuations using <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>.
10968           This benefit of composability gives the programmer incredible control and
10969           flexibility over their code. Returning a <code class="computeroutput"><span class="identifier">future</span></code>
10970           object rather than a <code class="computeroutput"><span class="identifier">shared_future</span></code>
10971           is also a much cheaper operation thereby improving performance. A <code class="computeroutput"><span class="identifier">shared_future</span></code> object is not necessary
10972           to take advantage of the chaining feature. It is also easy to go from a
10973           <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().
10974         </p>
10975 </div>
10976 <div class="section">
10977 <div class="titlepage"><div><div><h4 class="title">
10978 <a name="thread.synchronization.futures.reference"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference" title="Futures Reference">Futures Reference</a>
10979 </h4></div></div></div>
10980 <div class="toc"><dl class="toc">
10981 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_state">Enumeration
10982           <code class="computeroutput"><span class="identifier">state</span></code></a></span></dt>
10983 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_errc">Enumeration
10984           <code class="computeroutput"><span class="identifier">future_errc</span></code></a></span></dt>
10985 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.launch">Enumeration
10986           <code class="computeroutput"><span class="identifier">launch</span></code></a></span></dt>
10987 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.is_error_code_enum">Specialization
10988           <code class="computeroutput"><span class="identifier">is_error_code_enum</span><span class="special">&lt;</span><span class="identifier">future_errc</span><span class="special">&gt;</span></code></a></span></dt>
10989 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_error_code">Non-member
10990           function <code class="computeroutput"><span class="identifier">make_error_code</span><span class="special">()</span></code></a></span></dt>
10991 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_error_condition">Non-member
10992           function <code class="computeroutput"><span class="identifier">make_error_condition</span><span class="special">()</span></code></a></span></dt>
10993 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_category">Non-member
10994           function <code class="computeroutput"><span class="identifier">future_category</span><span class="special">()</span></code></a></span></dt>
10995 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_error">Class
10996           <code class="computeroutput"><span class="identifier">future_error</span></code></a></span></dt>
10997 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_status">Enumeration
10998           <code class="computeroutput"><span class="identifier">future_status</span></code></a></span></dt>
10999 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_error0">Class
11000           <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> EXPERIMENTAL</a></span></dt>
11001 <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>
11002 <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>
11003 <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>
11004 <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>
11005 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.decay_copy">Non-member
11006           function <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code></a></span></dt>
11007 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.async">Non-member
11008           function <code class="computeroutput"><span class="identifier">async</span><span class="special">()</span></code></a></span></dt>
11009 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.wait_for_any">Non-member
11010           function <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
11011           - EXTENSION</a></span></dt>
11012 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.wait_for_all">Non-member
11013           function <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
11014           - EXTENSION</a></span></dt>
11015 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.when_all">Non-member
11016           function <code class="computeroutput"><span class="identifier">when_all</span><span class="special">()</span></code>
11017           - EXTENSION</a></span></dt>
11018 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.when_any">Non-member
11019           function <code class="computeroutput"><span class="identifier">when_any</span><span class="special">()</span></code>
11020           - EXTENSION</a></span></dt>
11021 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_ready_future">Non-member
11022           function <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> EXTENSION</a></span></dt>
11023 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_exceptional">Non-member
11024           function <code class="computeroutput"><span class="identifier">make_exceptional</span><span class="special">()</span></code> EXTENSION</a></span></dt>
11025 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_future">Non-member
11026           function <code class="computeroutput"><span class="identifier">make_future</span><span class="special">()</span></code>
11027           DEPRECATED</a></span></dt>
11028 <dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_shared_future">Non-member
11029           function <code class="computeroutput"><span class="identifier">make_shared_future</span><span class="special">()</span></code> DEPRECATED</a></span></dt>
11030 </dl></div>
11031 <pre class="programlisting"><span class="comment">//#include &lt;boost/thread/future.hpp&gt;</span>
11032
11033 <span class="keyword">namespace</span> <span class="identifier">boost</span>
11034 <span class="special">{</span>
11035   <span class="keyword">namespace</span> <span class="identifier">future_state</span>  <span class="comment">// EXTENSION</span>
11036   <span class="special">{</span>
11037     <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>
11038   <span class="special">}</span>
11039
11040   <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_errc</span>
11041   <span class="special">{</span>
11042     <span class="identifier">broken_promise</span><span class="special">,</span>
11043     <span class="identifier">future_already_retrieved</span><span class="special">,</span>
11044     <span class="identifier">promise_already_satisfied</span><span class="special">,</span>
11045     <span class="identifier">no_state</span>
11046   <span class="special">};</span>
11047
11048   <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">launch</span>
11049   <span class="special">{</span>
11050     <span class="identifier">async</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11051     <span class="identifier">deferred</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11052     <span class="identifier">executor</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11053     <span class="identifier">any</span> <span class="special">=</span> <span class="identifier">async</span> <span class="special">|</span> <span class="identifier">deferred</span>
11054   <span class="special">};</span>
11055
11056   <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_status</span> <span class="special">{</span>
11057     <span class="identifier">ready</span><span class="special">,</span>  <span class="identifier">timeout</span><span class="special">,</span> <span class="identifier">deferred</span>
11058   <span class="special">};</span>
11059
11060   <span class="keyword">namespace</span> <span class="identifier">system</span>
11061   <span class="special">{</span>
11062     <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
11063     <span class="keyword">struct</span> <span class="identifier">is_error_code_enum</span><span class="special">&lt;</span><span class="identifier">future_errc</span><span class="special">&gt;</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span>
11064
11065     <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>
11066
11067     <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>
11068   <span class="special">}</span>
11069
11070   <span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span><span class="special">&amp;</span> <span class="identifier">future_category</span><span class="special">();</span>
11071
11072   <span class="keyword">class</span> <span class="identifier">future_error</span><span class="special">;</span>
11073
11074   <span class="keyword">class</span> <span class="identifier">exceptional_ptr</span><span class="special">;</span>
11075
11076   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
11077   <span class="keyword">class</span> <span class="identifier">promise</span><span class="special">;</span>
11078
11079   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
11080   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">promise</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;&amp;</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">promise</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;&amp;</span> <span class="identifier">y</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11081
11082   <span class="keyword">namespace</span> <span class="identifier">container</span> <span class="special">{</span>
11083     <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
11084     <span class="keyword">struct</span> <span class="identifier">uses_allocator</span><span class="special">&lt;</span><span class="identifier">promise</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;,</span> <span class="identifier">Alloc</span><span class="special">&gt;::</span> <span class="identifier">true_type</span><span class="special">;</span>
11085   <span class="special">}</span>
11086
11087   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
11088   <span class="keyword">class</span> <span class="identifier">future</span><span class="special">;</span>
11089
11090   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
11091   <span class="keyword">class</span> <span class="identifier">shared_future</span><span class="special">;</span>
11092
11093   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">&gt;</span>
11094   <span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">;</span>
11095   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">&gt;</span> <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">S</span><span class="special">&gt;&amp;,</span> <span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">S</span><span class="special">&gt;&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11096
11097   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
11098   <span class="keyword">struct</span> <span class="identifier">uses_allocator</span><span class="special">&lt;</span><span class="identifier">packaged_task</span> <span class="special">&lt;</span><span class="identifier">S</span><span class="special">&gt;,</span> <span class="identifier">Alloc</span><span class="special">&gt;;</span>
11099
11100   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
11101     <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">()&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
11102     <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
11103   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
11104     <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">()&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
11105     <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>
11106
11107   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
11108     <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">...)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
11109     <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
11110   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
11111     <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">...)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
11112     <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">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
11113   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
11114     <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">...)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
11115     <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&amp;</span><span class="identifier">ex</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
11116
11117   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
11118     <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>
11119   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
11120     <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">Fs</span><span class="special">&amp;...</span> <span class="identifier">fs</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11121
11122   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
11123     <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>
11124   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
11125     <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">Fs</span><span class="special">&amp;...</span> <span class="identifier">fs</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11126
11127   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
11128     <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</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">&gt;&gt;</span>
11129     <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>
11130   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">T</span><span class="special">&gt;</span>
11131     <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;...&gt;</span> <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;...</span> <span class="identifier">futures</span><span class="special">);</span>
11132   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
11133     <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</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">&gt;&gt;</span>
11134     <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>
11135   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">T</span><span class="special">&gt;</span>
11136     <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;...&gt;</span> <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;...</span> <span class="identifier">futures</span><span class="special">);</span>
11137
11138   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
11139     <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span> <span class="identifier">make_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">);</span>  <span class="comment">// DEPRECATED</span>
11140   <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">make_future</span><span class="special">();</span>  <span class="comment">// DEPRECATED</span>
11141
11142   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
11143     <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
11144   <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">make_ready_future</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
11145
11146   <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</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>
11147   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
11148     <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
11149   <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
11150
11151
11152   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
11153   <span class="identifier">shared_future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span> <span class="identifier">make_shared_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">);</span>  <span class="comment">// DEPRECATED</span>
11154   <span class="identifier">shared_future</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">make_shared_future</span><span class="special">();</span>  <span class="comment">// DEPRECATED</span>
11155 </pre>
11156 <div class="section">
11157 <div class="titlepage"><div><div><h5 class="title">
11158 <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
11159           <code class="computeroutput"><span class="identifier">state</span></code></a>
11160 </h5></div></div></div>
11161 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">future_state</span>
11162 <span class="special">{</span>
11163   <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>
11164 <span class="special">}</span>
11165 </pre>
11166 </div>
11167 <div class="section">
11168 <div class="titlepage"><div><div><h5 class="title">
11169 <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
11170           <code class="computeroutput"><span class="identifier">future_errc</span></code></a>
11171 </h5></div></div></div>
11172 <pre class="programlisting"> <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_errc</span>
11173  <span class="special">{</span>
11174    <span class="identifier">broken_promise</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span>
11175    <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>
11176    <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>
11177    <span class="identifier">no_state</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span>
11178  <span class="special">}</span>
11179
11180
11181 <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>
11182 </pre>
11183 </div>
11184 <div class="section">
11185 <div class="titlepage"><div><div><h5 class="title">
11186 <a name="thread.synchronization.futures.reference.launch"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.launch" title="Enumeration launch">Enumeration
11187           <code class="computeroutput"><span class="identifier">launch</span></code></a>
11188 </h5></div></div></div>
11189 <pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">launch</span>
11190 <span class="special">{</span>
11191   <span class="identifier">async</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11192   <span class="identifier">deferred</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11193   <span class="identifier">executor</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11194   <span class="identifier">any</span> <span class="special">=</span> <span class="identifier">async</span> <span class="special">|</span> <span class="identifier">deferred</span>
11195 <span class="special">};</span>
11196 </pre>
11197 <p>
11198             The enum type launch is a bitmask type with launch::async and launch::deferred
11199             denoting individual bits.
11200           </p>
11201 </div>
11202 <div class="section">
11203 <div class="titlepage"><div><div><h5 class="title">
11204 <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&lt;future_errc&gt;">Specialization
11205           <code class="computeroutput"><span class="identifier">is_error_code_enum</span><span class="special">&lt;</span><span class="identifier">future_errc</span><span class="special">&gt;</span></code></a>
11206 </h5></div></div></div>
11207 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
11208 <span class="special">{</span>
11209   <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
11210   <span class="keyword">struct</span> <span class="identifier">is_error_code_enum</span><span class="special">&lt;</span><span class="identifier">future_errc</span><span class="special">&gt;</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">true_type</span> <span class="special">{};</span>
11211
11212 <span class="special">}</span>
11213 </pre>
11214 </div>
11215 <div class="section">
11216 <div class="titlepage"><div><div><h5 class="title">
11217 <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
11218           function <code class="computeroutput"><span class="identifier">make_error_code</span><span class="special">()</span></code></a>
11219 </h5></div></div></div>
11220 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
11221 <span class="special">{</span>
11222   <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>
11223 <span class="special">}</span>
11224 </pre>
11225 <div class="variablelist">
11226 <p class="title"><b></b></p>
11227 <dl class="variablelist">
11228 <dt><span class="term">Returns:</span></dt>
11229 <dd><p>
11230                   <code class="computeroutput"><span class="identifier">error_code</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">e</span><span class="special">),</span>
11231                   <span class="identifier">future_category</span><span class="special">())</span></code>.
11232                 </p></dd>
11233 </dl>
11234 </div>
11235 </div>
11236 <div class="section">
11237 <div class="titlepage"><div><div><h5 class="title">
11238 <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
11239           function <code class="computeroutput"><span class="identifier">make_error_condition</span><span class="special">()</span></code></a>
11240 </h5></div></div></div>
11241 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
11242 <span class="special">{</span>
11243   <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>
11244 <span class="special">}</span>
11245 </pre>
11246 <div class="variablelist">
11247 <p class="title"><b></b></p>
11248 <dl class="variablelist">
11249 <dt><span class="term">Returns:</span></dt>
11250 <dd><p>
11251                   <code class="computeroutput"><span class="identifier">error_condition</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">e</span><span class="special">),</span> <span class="identifier">future_category</span><span class="special">())</span></code>.
11252                 </p></dd>
11253 </dl>
11254 </div>
11255 </div>
11256 <div class="section">
11257 <div class="titlepage"><div><div><h5 class="title">
11258 <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
11259           function <code class="computeroutput"><span class="identifier">future_category</span><span class="special">()</span></code></a>
11260 </h5></div></div></div>
11261 <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">&amp;</span> <span class="identifier">future_category</span><span class="special">();</span>
11262 </pre>
11263 <div class="variablelist">
11264 <p class="title"><b></b></p>
11265 <dl class="variablelist">
11266 <dt><span class="term">Returns:</span></dt>
11267 <dd><p>
11268                   A reference to an object of a type derived from class error_category.
11269                 </p></dd>
11270 <dt><span class="term">Notes:</span></dt>
11271 <dd><p>
11272                   The object's <code class="computeroutput"><span class="identifier">default_error_condition</span></code>
11273                   and equivalent virtual functions behave as specified for the class
11274                   <code class="computeroutput"><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span></code>. The object's
11275                   <code class="computeroutput"><span class="identifier">name</span></code> virtual function
11276                   returns a pointer to the string "future".
11277                 </p></dd>
11278 </dl>
11279 </div>
11280 </div>
11281 <div class="section">
11282 <div class="titlepage"><div><div><h5 class="title">
11283 <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
11284           <code class="computeroutput"><span class="identifier">future_error</span></code></a>
11285 </h5></div></div></div>
11286 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">future_error</span>
11287     <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span>
11288 <span class="special">{</span>
11289 <span class="keyword">public</span><span class="special">:</span>
11290     <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>
11291
11292     <span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&amp;</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>
11293 <span class="special">};</span>
11294 </pre>
11295 <div class="section">
11296 <div class="titlepage"><div><div><h6 class="title">
11297 <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>
11298 </h6></div></div></div>
11299 <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>
11300 </pre>
11301 <div class="variablelist">
11302 <p class="title"><b></b></p>
11303 <dl class="variablelist">
11304 <dt><span class="term">Effects:</span></dt>
11305 <dd><p>
11306                     Constructs a future_error.
11307                   </p></dd>
11308 <dt><span class="term">Postconditions:</span></dt>
11309 <dd><p>
11310                     <code class="computeroutput"><span class="identifier">code</span><span class="special">()==</span><span class="identifier">ec</span></code>
11311                   </p></dd>
11312 <dt><span class="term">Throws:</span></dt>
11313 <dd><p>
11314                     Nothing.
11315                   </p></dd>
11316 </dl>
11317 </div>
11318 </div>
11319 <div class="section">
11320 <div class="titlepage"><div><div><h6 class="title">
11321 <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
11322             function <code class="computeroutput"><span class="identifier">code</span><span class="special">()</span></code></a>
11323 </h6></div></div></div>
11324 <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">&amp;</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>
11325 </pre>
11326 <div class="variablelist">
11327 <p class="title"><b></b></p>
11328 <dl class="variablelist">
11329 <dt><span class="term">Returns:</span></dt>
11330 <dd><p>
11331                     The value of <code class="computeroutput"><span class="identifier">ec</span></code>
11332                     that was passed to the object's constructor.
11333                   </p></dd>
11334 </dl>
11335 </div>
11336 </div>
11337 </div>
11338 <div class="section">
11339 <div class="titlepage"><div><div><h5 class="title">
11340 <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
11341           <code class="computeroutput"><span class="identifier">future_status</span></code></a>
11342 </h5></div></div></div>
11343 <pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_status</span> <span class="special">{</span>
11344   <span class="identifier">ready</span><span class="special">,</span>  <span class="identifier">timeout</span><span class="special">,</span> <span class="identifier">deferred</span>
11345 <span class="special">};</span>
11346 </pre>
11347 </div>
11348 <div class="section">
11349 <div class="titlepage"><div><div><h5 class="title">
11350 <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
11351           <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> EXPERIMENTAL</a>
11352 </h5></div></div></div>
11353 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">exceptional_ptr</span>
11354 <span class="special">{</span>
11355 <span class="keyword">public</span><span class="special">:</span>
11356   <span class="identifier">exceptional_ptr</span><span class="special">();</span>
11357   <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>
11358   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">&gt;</span>
11359   <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">E</span><span class="special">&amp;&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
11360 <span class="special">};</span>
11361 </pre>
11362 <div class="section">
11363 <div class="titlepage"><div><div><h6 class="title">
11364 <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>
11365 </h6></div></div></div>
11366 <pre class="programlisting"><span class="identifier">exceptional_ptr</span><span class="special">();</span>
11367 <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>
11368 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">&gt;</span>
11369 <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">E</span><span class="special">&amp;&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
11370 </pre>
11371 <div class="variablelist">
11372 <p class="title"><b></b></p>
11373 <dl class="variablelist">
11374 <dt><span class="term">Effects:</span></dt>
11375 <dd><p>
11376                     The exception that is passed in to the constructor or the current
11377                     exception if no parameter is moved into the constructed <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> if it is an
11378                     rvalue. Otherwise the exception is copied into the constructed
11379                     <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>.
11380                   </p></dd>
11381 <dt><span class="term">Postconditions:</span></dt>
11382 <dd><p>
11383                     <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
11384                     <span class="special">==</span> <span class="keyword">true</span>
11385                     <span class="special">&amp;&amp;</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="special">=</span>
11386                     <span class="keyword">true</span> <span class="special">&amp;&amp;</span>
11387                     <span class="identifier">has_value</span><span class="special">()</span>
11388                     <span class="special">=</span> <span class="keyword">false</span></code>
11389                   </p></dd>
11390 <dt><span class="term">Throws:</span></dt>
11391 <dd><p>
11392                     Nothing.
11393                   </p></dd>
11394 </dl>
11395 </div>
11396 </div>
11397 </div>
11398 <div class="section">
11399 <div class="titlepage"><div><div><h5 class="title">
11400 <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>
11401 </h5></div></div></div>
11402 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
11403 <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>
11404 <span class="special">{</span>
11405
11406 <span class="keyword">public</span><span class="special">:</span>
11407   <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>
11408    <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">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
11409    <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">&amp;</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">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
11410
11411    <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>
11412   <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>
11413
11414   <span class="comment">// move support</span>
11415    <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">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11416    <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">&lt;</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">&lt;</span><span class="identifier">R</span><span class="special">&gt;&gt;&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
11417    <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">&amp;</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">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11418
11419   <span class="comment">// factories</span>
11420   <span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">share</span><span class="special">();</span>
11421
11422   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
11423    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</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">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
11424   <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11425   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
11426    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</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">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
11427   <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&amp;</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11428   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
11429    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</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">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
11430   <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">&amp;&amp;</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11431
11432   <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">unwrap</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
11433    <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>
11434
11435   <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">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
11436
11437   <span class="comment">// retrieving the value</span>
11438   <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get</span><span class="special">();</span>
11439   <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>
11440
11441   <span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
11442
11443   <span class="comment">// functions to check state</span>
11444   <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>
11445   <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>
11446   <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>
11447   <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>
11448
11449   <span class="comment">// waiting for the result to be ready</span>
11450   <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
11451   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
11452   <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
11453   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
11454   <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
11455
11456 <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATE_TIME</span>
11457   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
11458   <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">&amp;</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>
11459   <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">&amp;</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>
11460 <span class="preprocessor">#endif</span>
11461   <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>
11462   <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>
11463 <span class="special">};</span>
11464 </pre>
11465 <div class="section">
11466 <div class="titlepage"><div><div><h6 class="title">
11467 <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
11468             Constructor</a>
11469 </h6></div></div></div>
11470 <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>
11471 </pre>
11472 <div class="variablelist">
11473 <p class="title"><b></b></p>
11474 <dl class="variablelist">
11475 <dt><span class="term">Effects:</span></dt>
11476 <dd><p>
11477                     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>.
11478                   </p></dd>
11479 <dt><span class="term">Postconditions:</span></dt>
11480 <dd><p>
11481                     <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">-&gt;</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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11482                     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>.
11483                   </p></dd>
11484 <dt><span class="term">Throws:</span></dt>
11485 <dd><p>
11486                     Nothing.
11487                   </p></dd>
11488 </dl>
11489 </div>
11490 </div>
11491 <div class="section">
11492 <div class="titlepage"><div><div><h6 class="title">
11493 <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>
11494 </h6></div></div></div>
11495 <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>
11496 </pre>
11497 <div class="variablelist">
11498 <p class="title"><b></b></p>
11499 <dl class="variablelist">
11500 <dt><span class="term">Effects:</span></dt>
11501 <dd><p>
11502                     Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11503                   </p></dd>
11504 <dt><span class="term">Throws:</span></dt>
11505 <dd><p>
11506                     Nothing.
11507                   </p></dd>
11508 </dl>
11509 </div>
11510 </div>
11511 <div class="section">
11512 <div class="titlepage"><div><div><h6 class="title">
11513 <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
11514             Constructor</a>
11515 </h6></div></div></div>
11516 <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">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
11517 </pre>
11518 <div class="variablelist">
11519 <p class="title"><b></b></p>
11520 <dl class="variablelist">
11521 <dt><span class="term">Effects:</span></dt>
11522 <dd><p>
11523                     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
11524                     ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code>
11525                     to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11526                   </p></dd>
11527 <dt><span class="term">Postconditions:</span></dt>
11528 <dd><p>
11529                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11530                     returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-&gt;</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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code>
11531                     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
11532                     shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11533                     <code class="computeroutput"><span class="identifier">other</span></code> is not
11534                     associated with any shared state.
11535                   </p></dd>
11536 <dt><span class="term">Throws:</span></dt>
11537 <dd><p>
11538                     Nothing.
11539                   </p></dd>
11540 <dt><span class="term">Notes:</span></dt>
11541 <dd><p>
11542                     If the compiler does not support rvalue-references, this is implemented
11543                     using the boost.thread move emulation.
11544                   </p></dd>
11545 </dl>
11546 </div>
11547 </div>
11548 <div class="section">
11549 <div class="titlepage"><div><div><h6 class="title">
11550 <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
11551             Move Constructor - EXTENSION</a>
11552 </h6></div></div></div>
11553 <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">&lt;</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">&lt;</span><span class="identifier">R</span><span class="special">&gt;&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
11554 </pre>
11555 <div class="warning"><table border="0" summary="Warning">
11556 <tr>
11557 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
11558 <th align="left">Warning</th>
11559 </tr>
11560 <tr><td align="left" valign="top"><p>
11561                 This constructor is experimental and subject to change in future
11562                 versions. There are not too much tests yet, so it is possible that
11563                 you can find out some trivial bugs :(
11564               </p></td></tr>
11565 </table></div>
11566 <div class="variablelist">
11567 <p class="title"><b></b></p>
11568 <dl class="variablelist">
11569 <dt><span class="term">Requires:</span></dt>
11570 <dd>
11571 <p>
11572                     <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">valid</span><span class="special">()</span></code>.
11573                   </p>
11574 <p>
11575                     [Effects:
11576                   </p>
11577 <p>
11578                     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
11579                     ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code>
11580                     and unwrapping the inner future (see <code class="computeroutput"><span class="identifier">unwrap</span><span class="special">()</span></code>).
11581                   </p>
11582 </dd>
11583 <dt><span class="term">Postconditions:</span></dt>
11584 <dd><p>
11585                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11586                     returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-&gt;</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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code>
11587                     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
11588                     shared state is now unwrapped and the inner future shared state
11589                     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>
11590                     is not associated with any shared state, <code class="computeroutput"><span class="special">!</span>
11591                     <span class="identifier">other</span><span class="special">.</span><span class="identifier">valid</span><span class="special">()</span></code>.
11592                   </p></dd>
11593 <dt><span class="term">Throws:</span></dt>
11594 <dd><p>
11595                     Nothing.
11596                   </p></dd>
11597 <dt><span class="term">Notes:</span></dt>
11598 <dd><p>
11599                     If the compiler does not support rvalue-references, this is implemented
11600                     using the boost.thread move emulation.
11601                   </p></dd>
11602 </dl>
11603 </div>
11604 </div>
11605 <div class="section">
11606 <div class="titlepage"><div><div><h6 class="title">
11607 <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
11608             Assignment Operator</a>
11609 </h6></div></div></div>
11610 <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">&amp;</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">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
11611 </pre>
11612 <div class="variablelist">
11613 <p class="title"><b></b></p>
11614 <dl class="variablelist">
11615 <dt><span class="term">Effects:</span></dt>
11616 <dd><p>
11617                     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>.
11618                   </p></dd>
11619 <dt><span class="term">Postconditions:</span></dt>
11620 <dd><p>
11621                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11622                     returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-&gt;</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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code>
11623                     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
11624                     shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
11625                     <code class="computeroutput"><span class="identifier">other</span></code> is not
11626                     associated with any shared state. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was associated with an asynchronous
11627                     result prior to the call, that result no longer has an associated
11628                     <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.
11629                   </p></dd>
11630 <dt><span class="term">Throws:</span></dt>
11631 <dd><p>
11632                     Nothing.
11633                   </p></dd>
11634 <dt><span class="term">Notes:</span></dt>
11635 <dd><p>
11636                     If the compiler does not support rvalue-references, this is implemented
11637                     using the boost.thread move emulation.
11638                   </p></dd>
11639 </dl>
11640 </div>
11641 </div>
11642 <div class="section">
11643 <div class="titlepage"><div><div><h6 class="title">
11644 <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
11645             function <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a>
11646 </h6></div></div></div>
11647 <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">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="identifier">no_except</span><span class="special">;</span>
11648 </pre>
11649 <div class="variablelist">
11650 <p class="title"><b></b></p>
11651 <dl class="variablelist">
11652 <dt><span class="term">Effects:</span></dt>
11653 <dd><p>
11654                     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>.
11655                   </p></dd>
11656 <dt><span class="term">Postconditions:</span></dt>
11657 <dd><p>
11658                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11659                     returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-&gt;</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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code>
11660                     returns the value of <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</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
11661                     shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
11662                     otherwise <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11663                     has no associated result. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was associated with a shared
11664                     state, that result is now associated with <code class="computeroutput"><span class="identifier">other</span></code>,
11665                     otherwise <code class="computeroutput"><span class="identifier">other</span></code>
11666                     has no associated result.
11667                   </p></dd>
11668 <dt><span class="term">Throws:</span></dt>
11669 <dd><p>
11670                     Nothing.
11671                   </p></dd>
11672 </dl>
11673 </div>
11674 </div>
11675 <div class="section">
11676 <div class="titlepage"><div><div><h6 class="title">
11677 <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
11678             function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a>
11679 </h6></div></div></div>
11680 <pre class="programlisting"><span class="identifier">R</span> <span class="identifier">get</span><span class="special">();</span>
11681 <span class="identifier">R</span><span class="special">&amp;</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">&lt;</span><span class="identifier">R</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">();</span>
11682 <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">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">();</span>
11683 </pre>
11684 <div class="variablelist">
11685 <p class="title"><b></b></p>
11686 <dl class="variablelist">
11687 <dt><span class="term">Effects:</span></dt>
11688 <dd><p>
11689                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11690                     is associated with a shared state, waits until the result is
11691                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
11692                     and retrieves the result (whether that is a value or an exception).
11693                   </p></dd>
11694 <dt><span class="term">Returns:</span></dt>
11695 <dd>
11696 <p>
11697                     - <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">&lt;</span><span class="identifier">R</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span></code>
11698                     return the stored reference.
11699                   </p>
11700 <p>
11701                     - <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">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code>,
11702                     there is no return value.
11703                   </p>
11704 <p>
11705                     - <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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code>
11706                     returns an rvalue-reference to the value stored in the shared
11707                     state.
11708                   </p>
11709 </dd>
11710 <dt><span class="term">Postconditions:</span></dt>
11711 <dd><p>
11712                     <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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11713                     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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11714                     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>.
11715                   </p></dd>
11716 <dt><span class="term">Throws:</span></dt>
11717 <dd>
11718 <p>
11719                     - <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>
11720                     is not associated with a shared state.
11721                   </p>
11722 <p>
11723                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
11724                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
11725                     of the call, and the current thread is interrupted.
11726                   </p>
11727 <p>
11728                     - Any exception stored in the shared state in place of a value.
11729                   </p>
11730 </dd>
11731 <dt><span class="term">Notes:</span></dt>
11732 <dd><p>
11733                     <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
11734                     is an <span class="emphasis"><em>interruption point</em></span>.
11735                   </p></dd>
11736 </dl>
11737 </div>
11738 </div>
11739 <div class="section">
11740 <div class="titlepage"><div><div><h6 class="title">
11741 <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
11742             function <code class="computeroutput"><span class="identifier">get_or</span><span class="special">()</span></code>
11743             - EXTENSION</a>
11744 </h6></div></div></div>
11745 <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">&amp;&amp;</span> <span class="identifier">v</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11746 <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">&amp;</span> <span class="identifier">v</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
11747 <span class="identifier">R</span><span class="special">&amp;</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">&lt;</span><span class="identifier">R</span><span class="special">&amp;&gt;::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
11748 <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">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">get_or</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
11749 </pre>
11750 <div class="warning"><table border="0" summary="Warning">
11751 <tr>
11752 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
11753 <th align="left">Warning</th>
11754 </tr>
11755 <tr><td align="left" valign="top"><p>
11756                 These functions are experimental and subject to change in future
11757                 versions. There are not too much tests yet, so it is possible that
11758                 you can find out some trivial bugs :(
11759               </p></td></tr>
11760 </table></div>
11761 <div class="variablelist">
11762 <p class="title"><b></b></p>
11763 <dl class="variablelist">
11764 <dt><span class="term">Effects:</span></dt>
11765 <dd><p>
11766                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11767                     is associated with a shared state, waits until the result is
11768                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
11769                     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.
11770                   </p></dd>
11771 <dt><span class="term">Returns:</span></dt>
11772 <dd>
11773 <p>
11774                     - <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">&lt;</span><span class="identifier">R</span><span class="special">&amp;&gt;::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code>
11775                     return the stored reference if has_value() and the passes parameter
11776                     otherwise.
11777                   </p>
11778 <p>
11779                     - <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">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">get_or</span><span class="special">()</span></code>,
11780                     there is no return value, but the function doesn't throws even
11781                     if the shared state contained an exception.
11782                   </p>
11783 <p>
11784                     - <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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get_or</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span></code>
11785                     returns an rvalue-reference to the value stored in the shared
11786                     state if <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> and an rvalue-reference build
11787                     with the parameter <code class="computeroutput"><span class="identifier">v</span></code>.
11788                   </p>
11789 </dd>
11790 <dt><span class="term">Postconditions:</span></dt>
11791 <dd><p>
11792                     <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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11793                     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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11794                     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>.
11795                   </p></dd>
11796 <dt><span class="term">Throws:</span></dt>
11797 <dd><p>
11798                     - <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>
11799                     is not associated with a shared state.
11800                   </p></dd>
11801 <dt><span class="term">Notes:</span></dt>
11802 <dd><p>
11803                     <code class="computeroutput"><span class="identifier">get_or</span><span class="special">()</span></code>
11804                     is an <span class="emphasis"><em>interruption point</em></span>.
11805                   </p></dd>
11806 </dl>
11807 </div>
11808 </div>
11809 <div class="section">
11810 <div class="titlepage"><div><div><h6 class="title">
11811 <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
11812             function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
11813 </h6></div></div></div>
11814 <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>
11815 </pre>
11816 <div class="variablelist">
11817 <p class="title"><b></b></p>
11818 <dl class="variablelist">
11819 <dt><span class="term">Effects:</span></dt>
11820 <dd><p>
11821                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11822                     is associated with a shared state, waits until the result is
11823                     ready. If the result is not ready on entry, and the result has
11824                     a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
11825                     prior to waiting.
11826                   </p></dd>
11827 <dt><span class="term">Throws:</span></dt>
11828 <dd>
11829 <p>
11830                     - <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>
11831                     is not associated with a shared state.
11832                   </p>
11833 <p>
11834                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
11835                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
11836                     of the call, and the current thread is interrupted.
11837                   </p>
11838 <p>
11839                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
11840                     if such a callback is called.
11841                   </p>
11842 </dd>
11843 <dt><span class="term">Postconditions:</span></dt>
11844 <dd><p>
11845                     <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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11846                     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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11847                     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>.
11848                   </p></dd>
11849 <dt><span class="term">Notes:</span></dt>
11850 <dd><p>
11851                     <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
11852                     is an <span class="emphasis"><em>interruption point</em></span>.
11853                   </p></dd>
11854 </dl>
11855 </div>
11856 </div>
11857 <div class="section">
11858 <div class="titlepage"><div><div><h6 class="title">
11859 <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
11860             function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
11861             DEPRECATED SINCE V3.0.0</a>
11862 </h6></div></div></div>
11863 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
11864 <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">&amp;</span> <span class="identifier">wait_duration</span><span class="special">);</span>
11865 </pre>
11866 <div class="warning"><table border="0" summary="Warning">
11867 <tr>
11868 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
11869 <th align="left">Warning</th>
11870 </tr>
11871 <tr><td align="left" valign="top">
11872 <p>
11873                 DEPRECATED since 3.00.
11874               </p>
11875 <p>
11876                 Use instead <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for" title="template &lt;class Rep, class Period&gt; cv_status wait_for(boost::unique_lock&lt;boost::mutex&gt;&amp; lock, const chrono::duration&lt;Rep, Period&gt;&amp; rel_time)"><code class="computeroutput"><span class="identifier">wait_for</span></code></a>.
11877               </p>
11878 </td></tr>
11879 </table></div>
11880 <div class="variablelist">
11881 <p class="title"><b></b></p>
11882 <dl class="variablelist">
11883 <dt><span class="term">Effects:</span></dt>
11884 <dd><p>
11885                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11886                     is associated with a shared state, waits until the result is
11887                     ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
11888                     has elapsed. If the result is not ready on entry, and the result
11889                     has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
11890                     invoked prior to waiting.
11891                   </p></dd>
11892 <dt><span class="term">Returns:</span></dt>
11893 <dd><p>
11894                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11895                     is associated with a shared state, and that result is ready before
11896                     the specified time has elapsed, <code class="computeroutput"><span class="keyword">false</span></code>
11897                     otherwise.
11898                   </p></dd>
11899 <dt><span class="term">Throws:</span></dt>
11900 <dd>
11901 <p>
11902                     - <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>
11903                     is not associated with a shared state.
11904                   </p>
11905 <p>
11906                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
11907                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
11908                     of the call, and the current thread is interrupted.
11909                   </p>
11910 <p>
11911                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
11912                     if such a callback is called.
11913                   </p>
11914 </dd>
11915 <dt><span class="term">Postconditions:</span></dt>
11916 <dd><p>
11917                     If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
11918                     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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11919                     returns <code class="computeroutput"><span class="keyword">true</span></code> and
11920                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11921                     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>.
11922                   </p></dd>
11923 <dt><span class="term">Notes:</span></dt>
11924 <dd><p>
11925                     <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
11926                     is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
11927                     meets the Boost.DateTime time duration requirements.
11928                   </p></dd>
11929 </dl>
11930 </div>
11931 </div>
11932 <div class="section">
11933 <div class="titlepage"><div><div><h6 class="title">
11934 <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
11935             function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
11936             DEPRECATED SINCE V3.0.0</a>
11937 </h6></div></div></div>
11938 <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">&amp;</span> <span class="identifier">wait_timeout</span><span class="special">);</span>
11939 </pre>
11940 <div class="warning"><table border="0" summary="Warning">
11941 <tr>
11942 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
11943 <th align="left">Warning</th>
11944 </tr>
11945 <tr><td align="left" valign="top">
11946 <p>
11947                 DEPRECATED since 3.00.
11948               </p>
11949 <p>
11950                 Use instead <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until" title="template &lt;class Clock, class Duration&gt; cv_status wait_until(boost::unique_lock&lt;boost::mutex&gt;&amp; lock, const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time)"><code class="computeroutput"><span class="identifier">wait_until</span></code></a>.
11951               </p>
11952 </td></tr>
11953 </table></div>
11954 <div class="variablelist">
11955 <p class="title"><b></b></p>
11956 <dl class="variablelist">
11957 <dt><span class="term">Effects:</span></dt>
11958 <dd><p>
11959                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11960                     is associated with a shared state, waits until the result is
11961                     ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
11962                     has passed. If the result is not ready on entry, and the result
11963                     has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
11964                     invoked prior to waiting.
11965                   </p></dd>
11966 <dt><span class="term">Returns:</span></dt>
11967 <dd><p>
11968                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
11969                     is associated with a shared state, and that result is ready before
11970                     the specified time has passed, <code class="computeroutput"><span class="keyword">false</span></code>
11971                     otherwise.
11972                   </p></dd>
11973 <dt><span class="term">Throws:</span></dt>
11974 <dd>
11975 <p>
11976                     - <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>
11977                     is not associated with a shared state.
11978                   </p>
11979 <p>
11980                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
11981                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
11982                     of the call, and the current thread is interrupted.
11983                   </p>
11984 <p>
11985                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
11986                     if such a callback is called.
11987                   </p>
11988 </dd>
11989 <dt><span class="term">Postconditions:</span></dt>
11990 <dd><p>
11991                     If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
11992                     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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
11993                     returns <code class="computeroutput"><span class="keyword">true</span></code> and
11994                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
11995                     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>.
11996                   </p></dd>
11997 <dt><span class="term">Notes:</span></dt>
11998 <dd><p>
11999                     <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12000                     is an <span class="emphasis"><em>interruption point</em></span>.
12001                   </p></dd>
12002 </dl>
12003 </div>
12004 </div>
12005 <div class="section">
12006 <div class="titlepage"><div><div><h6 class="title">
12007 <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
12008             function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code></a>
12009 </h6></div></div></div>
12010 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
12011 <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12012 </pre>
12013 <div class="variablelist">
12014 <p class="title"><b></b></p>
12015 <dl class="variablelist">
12016 <dt><span class="term">Effects:</span></dt>
12017 <dd><p>
12018                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12019                     is associated with a shared state, waits until the result is
12020                     ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
12021                     has elapsed. If the result is not ready on entry, and the result
12022                     has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12023                     invoked prior to waiting.
12024                   </p></dd>
12025 <dt><span class="term">Returns:</span></dt>
12026 <dd>
12027 <p>
12028                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12029                     if the shared state contains a deferred function. (Not implemented
12030                     yet)
12031                   </p>
12032 <p>
12033                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12034                     if the shared state is ready.
12035                   </p>
12036 <p>
12037                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12038                     if the function is returning because the relative timeout specified
12039                     by <code class="computeroutput"><span class="identifier">rel_time</span></code> has
12040                     expired.
12041                   </p>
12042 </dd>
12043 <dt><span class="term">Throws:</span></dt>
12044 <dd>
12045 <p>
12046                     - <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>
12047                     is not associated with a shared state.
12048                   </p>
12049 <p>
12050                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12051                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12052                     of the call, and the current thread is interrupted.
12053                   </p>
12054 <p>
12055                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12056                     if such a callback is called.
12057                   </p>
12058 </dd>
12059 <dt><span class="term">Postconditions:</span></dt>
12060 <dd><p>
12061                     If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12062                     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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12063                     returns <code class="computeroutput"><span class="keyword">true</span></code> and
12064                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12065                     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>.
12066                   </p></dd>
12067 <dt><span class="term">Notes:</span></dt>
12068 <dd><p>
12069                     <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code>
12070                     is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
12071                     meets the Boost.DateTime time duration requirements.
12072                   </p></dd>
12073 </dl>
12074 </div>
12075 </div>
12076 <div class="section">
12077 <div class="titlepage"><div><div><h6 class="title">
12078 <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
12079             function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
12080 </h6></div></div></div>
12081 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
12082 <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12083 </pre>
12084 <div class="variablelist">
12085 <p class="title"><b></b></p>
12086 <dl class="variablelist">
12087 <dt><span class="term">Effects:</span></dt>
12088 <dd><p>
12089                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12090                     is associated with a shared state, waits until the result is
12091                     ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
12092                     has passed. If the result is not ready on entry, and the result
12093                     has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12094                     invoked prior to waiting.
12095                   </p></dd>
12096 <dt><span class="term">Returns:</span></dt>
12097 <dd>
12098 <p>
12099                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12100                     if the shared state contains a deferred function. (Not implemented
12101                     yet)
12102                   </p>
12103 <p>
12104                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12105                     if the shared state is ready.
12106                   </p>
12107 <p>
12108                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12109                     if the function is returning because the absolute timeout specified
12110                     by <code class="computeroutput"><span class="identifier">absl_time</span></code>
12111                     has reached.
12112                   </p>
12113 </dd>
12114 <dt><span class="term">Throws:</span></dt>
12115 <dd>
12116 <p>
12117                     - <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>
12118                     is not associated with a shared state.
12119                   </p>
12120 <p>
12121                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12122                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12123                     of the call, and the current thread is interrupted.
12124                   </p>
12125 <p>
12126                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12127                     if such a callback is called.
12128                   </p>
12129 </dd>
12130 <dt><span class="term">Postconditions:</span></dt>
12131 <dd><p>
12132                     If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12133                     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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12134                     returns <code class="computeroutput"><span class="keyword">true</span></code> and
12135                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12136                     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>.
12137                   </p></dd>
12138 <dt><span class="term">Notes:</span></dt>
12139 <dd><p>
12140                     <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code>
12141                     is an <span class="emphasis"><em>interruption point</em></span>.
12142                   </p></dd>
12143 </dl>
12144 </div>
12145 </div>
12146 <div class="section">
12147 <div class="titlepage"><div><div><h6 class="title">
12148 <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
12149             function <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span></code></a>
12150 </h6></div></div></div>
12151 <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>
12152 </pre>
12153 <div class="variablelist">
12154 <p class="title"><b></b></p>
12155 <dl class="variablelist">
12156 <dt><span class="term">Returns:</span></dt>
12157 <dd><p>
12158                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12159                     is associated with a shared state, <code class="computeroutput"><span class="keyword">false</span></code>
12160                     otherwise.
12161                   </p></dd>
12162 <dt><span class="term">Remarks:</span></dt>
12163 <dd><p>
12164                     The result of this function is not stable and that the future
12165                     could become invalid even if the function returned true or vice-versa.
12166                   </p></dd>
12167 <dt><span class="term">Throws:</span></dt>
12168 <dd><p>
12169                     Nothing.
12170                   </p></dd>
12171 </dl>
12172 </div>
12173 </div>
12174 <div class="section">
12175 <div class="titlepage"><div><div><h6 class="title">
12176 <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
12177             function <code class="computeroutput"><span class="identifier">is_ready</span><span class="special">()</span></code>
12178             EXTENSION</a>
12179 </h6></div></div></div>
12180 <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>
12181 </pre>
12182 <div class="variablelist">
12183 <p class="title"><b></b></p>
12184 <dl class="variablelist">
12185 <dt><span class="term">Returns:</span></dt>
12186 <dd><p>
12187                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12188                     is associated with a shared state and that result is ready for
12189                     retrieval, <code class="computeroutput"><span class="keyword">false</span></code>
12190                     otherwise.
12191                   </p></dd>
12192 <dt><span class="term">Remarks:</span></dt>
12193 <dd><p>
12194                     The result of this function is not stable and that the future
12195                     could become not ready even if the function returned true or
12196                     vice-versa.
12197                   </p></dd>
12198 <dt><span class="term">Throws:</span></dt>
12199 <dd><p>
12200                     Nothing.
12201                   </p></dd>
12202 </dl>
12203 </div>
12204 </div>
12205 <div class="section">
12206 <div class="titlepage"><div><div><h6 class="title">
12207 <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
12208             function <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code>
12209             EXTENSION</a>
12210 </h6></div></div></div>
12211 <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>
12212 </pre>
12213 <div class="variablelist">
12214 <p class="title"><b></b></p>
12215 <dl class="variablelist">
12216 <dt><span class="term">Returns:</span></dt>
12217 <dd><p>
12218                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12219                     is associated with a shared state, that result is ready for retrieval,
12220                     and the result is a stored value, <code class="computeroutput"><span class="keyword">false</span></code>
12221                     otherwise.
12222                   </p></dd>
12223 <dt><span class="term">Remarks:</span></dt>
12224 <dd><p>
12225                     The result of this function is not stable and the future could
12226                     lost its value even if the function returned true or vice-versa.
12227                   </p></dd>
12228 <dt><span class="term">Throws:</span></dt>
12229 <dd><p>
12230                     Nothing.
12231                   </p></dd>
12232 </dl>
12233 </div>
12234 </div>
12235 <div class="section">
12236 <div class="titlepage"><div><div><h6 class="title">
12237 <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
12238             function <code class="computeroutput"><span class="identifier">has_exception</span><span class="special">()</span></code> EXTENSION</a>
12239 </h6></div></div></div>
12240 <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>
12241 </pre>
12242 <div class="variablelist">
12243 <p class="title"><b></b></p>
12244 <dl class="variablelist">
12245 <dt><span class="term">Returns:</span></dt>
12246 <dd><p>
12247                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12248                     is associated with a shared state, that result is ready for retrieval,
12249                     and the result is a stored exception, <code class="computeroutput"><span class="keyword">false</span></code>
12250                     otherwise.
12251                   </p></dd>
12252 <dt><span class="term">Remarks:</span></dt>
12253 <dd><p>
12254                     The result of this function is not stable and the future could
12255                     lost its exception even if the function returned true or vice-versa.
12256                   </p></dd>
12257 <dt><span class="term">Throws:</span></dt>
12258 <dd><p>
12259                     Nothing.
12260                   </p></dd>
12261 </dl>
12262 </div>
12263 </div>
12264 <div class="section">
12265 <div class="titlepage"><div><div><h6 class="title">
12266 <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
12267             function <code class="computeroutput"><span class="identifier">get_exception_ptr</span><span class="special">()</span></code> EXTENSION</a>
12268 </h6></div></div></div>
12269 <pre class="programlisting"><span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span>
12270 </pre>
12271 <div class="variablelist">
12272 <p class="title"><b></b></p>
12273 <dl class="variablelist">
12274 <dt><span class="term">Effects:</span></dt>
12275 <dd><p>
12276                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12277                     is associated with a shared state, waits until the result is
12278                     ready. If the result is not ready on entry, and the result has
12279                     a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
12280                     prior to waiting.
12281                   </p></dd>
12282 <dt><span class="term">Returns:</span></dt>
12283 <dd><p>
12284                     a exception_ptr, storring or not an exception.
12285                   </p></dd>
12286 <dt><span class="term">Remarks:</span></dt>
12287 <dd><p>
12288                     The result of this function is not stable and the future could
12289                     lost its exception even if the function returned a valid <code class="computeroutput"><span class="identifier">exception_ptr</span></code> or vice-versa.
12290                   </p></dd>
12291 <dt><span class="term">Throws:</span></dt>
12292 <dd><p>
12293                     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.
12294                   </p></dd>
12295 </dl>
12296 </div>
12297 </div>
12298 <div class="section">
12299 <div class="titlepage"><div><div><h6 class="title">
12300 <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
12301             function <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code>
12302             EXTENSION</a>
12303 </h6></div></div></div>
12304 <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>
12305 </pre>
12306 <div class="variablelist">
12307 <p class="title"><b></b></p>
12308 <dl class="variablelist">
12309 <dt><span class="term">Effects:</span></dt>
12310 <dd><p>
12311                     Determine the state of the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
12312                     if any.
12313                   </p></dd>
12314 <dt><span class="term">Returns:</span></dt>
12315 <dd><p>
12316                     <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>
12317                     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
12318                     state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready for retrieval,
12319                     <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.
12320                   </p></dd>
12321 <dt><span class="term">Remarks:</span></dt>
12322 <dd><p>
12323                     The result of this function is not stable.
12324                   </p></dd>
12325 <dt><span class="term">Throws:</span></dt>
12326 <dd><p>
12327                     Nothing.
12328                   </p></dd>
12329 </dl>
12330 </div>
12331 </div>
12332 <div class="section">
12333 <div class="titlepage"><div><div><h6 class="title">
12334 <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
12335             function <code class="computeroutput"><span class="identifier">share</span><span class="special">()</span></code></a>
12336 </h6></div></div></div>
12337 <pre class="programlisting"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">share</span><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">Returns:</span></dt>
12343 <dd><p>
12344                     <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;(</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>.
12345                   </p></dd>
12346 <dt><span class="term">Postconditions:</span></dt>
12347 <dd><p>
12348                     <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">valid</span><span class="special">()</span>
12349                     <span class="special">==</span> <span class="keyword">false</span></code>.
12350                   </p></dd>
12351 </dl>
12352 </div>
12353 </div>
12354 <div class="section">
12355 <div class="titlepage"><div><div><h6 class="title">
12356 <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
12357             function <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code>
12358             - EXTENSION</a>
12359 </h6></div></div></div>
12360 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
12361  <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</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">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
12362 <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
12363 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
12364  <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</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">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
12365 <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&amp;</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
12366 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
12367  <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</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">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
12368 <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">&amp;&amp;</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
12369 </pre>
12370 <div class="warning"><table border="0" summary="Warning">
12371 <tr>
12372 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
12373 <th align="left">Warning</th>
12374 </tr>
12375 <tr><td align="left" valign="top"><p>
12376                 These functions are experimental and subject to change in future
12377                 versions. There are not too much tests yet, so it is possible that
12378                 you can find out some trivial bugs :(
12379               </p></td></tr>
12380 </table></div>
12381 <div class="note"><table border="0" summary="Note">
12382 <tr>
12383 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
12384 <th align="left">Note</th>
12385 </tr>
12386 <tr><td align="left" valign="top"><p>
12387                 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&lt;T&gt; and related
12388                 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
12389                 H. Sutter, S. Mithani.
12390               </p></td></tr>
12391 </table></div>
12392 <div class="variablelist">
12393 <p class="title"><b></b></p>
12394 <dl class="variablelist">
12395 <dt><span class="term">Notes:</span></dt>
12396 <dd><p>
12397                     The three functions differ only by input parameters. The first
12398                     only takes a callable object which accepts a future object as
12399                     a parameter. The second function takes a scheduler as the first
12400                     parameter and a callable object as the second parameter. The
12401                     third function takes a launch policy as the first parameter and
12402                     a callable object as the second parameter.
12403                   </p></dd>
12404 <dt><span class="term">Effects:</span></dt>
12405 <dd>
12406 <p>
12407                     All the functions create a shared state that is associated with
12408                     the returned future object. The further behavior of the functions
12409                     is as follows.
12410                   </p>
12411 <p>
12412                     - The continuation is called when the object's shared state is
12413                     ready (has a value or exception stored).
12414                   </p>
12415 <p>
12416                     - The continuation launches according to the specified policy
12417                     or scheduler.
12418                   </p>
12419 <p>
12420                     - When the scheduler or launch policy is not provided the continuation
12421                     inherits the parent's launch policy or scheduler.
12422                   </p>
12423 <p>
12424                     - Any value returned from the continuation is stored as the result
12425                     in the shared state of the resulting <code class="computeroutput"><span class="identifier">future</span></code>.
12426                     Any exception propagated from the execution of the continuation
12427                     is stored as the exceptional result in the shared state of the
12428                     resulting <code class="computeroutput"><span class="identifier">future</span></code>.
12429                   </p>
12430 <p>
12431                     - If the parent was created with <code class="computeroutput"><span class="identifier">promise</span><span class="special">&lt;&gt;</span></code> or with a <code class="computeroutput"><span class="identifier">packaged_task</span><span class="special">&lt;&gt;</span></code>
12432                     (has no associated launch policy), the continuation behaves the
12433                     same as the third overload with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span> <span class="special">|</span>
12434                     <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> and the same argument
12435                     for <code class="computeroutput"><span class="identifier">func</span></code>.
12436                   </p>
12437 <p>
12438                     - 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>
12439                     and the continuation does not have a specified launch policy
12440                     or scheduler, then the parent is filled by immediately calling
12441                     <code class="computeroutput"><span class="special">.</span><span class="identifier">wait</span><span class="special">()</span></code>, and the policy of the antecedent
12442                     is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>.
12443                   </p>
12444 </dd>
12445 <dt><span class="term">Returns:</span></dt>
12446 <dd><p>
12447                     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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</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">)&gt;</span></code>
12448                     that refers to the shared state created by the continuation.
12449                   </p></dd>
12450 <dt><span class="term">Notes:</span></dt>
12451 <dd>
12452 <p>
12453                     - Note that nested futures are not implicitly unwrapped yet.
12454                     This could be subject to change in future versions.
12455                   </p>
12456 <p>
12457                     - The returned futures behave as the ones returned from boost::async,
12458                     the destructor of the future object returned from then will block.
12459                     This could be subject to change in future versions.
12460                   </p>
12461 </dd>
12462 <dt><span class="term">Postconditions:</span></dt>
12463 <dd>
12464 <p>
12465                     - 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
12466                     passed to the parameter of the continuation function is a copy
12467                     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>.
12468                   </p>
12469 <p>
12470                     - <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
12471                     <span class="special">==</span> <span class="keyword">false</span></code>
12472                     on original future; <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
12473                     <span class="keyword">true</span></code> on the <code class="computeroutput"><span class="identifier">future</span></code> returned from then.
12474                   </p>
12475 </dd>
12476 </dl>
12477 </div>
12478 </div>
12479 <div class="section">
12480 <div class="titlepage"><div><div><h6 class="title">
12481 <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
12482             function <code class="computeroutput"><span class="identifier">unwrap</span><span class="special">()</span></code>
12483             EXTENSION</a>
12484 </h6></div></div></div>
12485 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R2</span><span class="special">&gt;</span>
12486  <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">&lt;</span><span class="identifier">R2</span><span class="special">&gt;</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">&lt;</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">&lt;</span><span class="identifier">R2</span><span class="special">&gt;&gt;::</span><span class="identifier">unwrap</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
12487 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R2</span><span class="special">&gt;</span>
12488  <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">&lt;</span><span class="identifier">R2</span><span class="special">&gt;</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">&lt;</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">&lt;</span><span class="identifier">R2</span><span class="special">&gt;&gt;::</span><span class="identifier">unwrap</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
12489 </pre>
12490 <div class="warning"><table border="0" summary="Warning">
12491 <tr>
12492 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
12493 <th align="left">Warning</th>
12494 </tr>
12495 <tr><td align="left" valign="top"><p>
12496                 These functions are experimental and subject to change in future
12497                 versions. There are not too much tests yet, so it is possible that
12498                 you can find out some trivial bugs :(
12499               </p></td></tr>
12500 </table></div>
12501 <div class="note"><table border="0" summary="Note">
12502 <tr>
12503 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
12504 <th align="left">Note</th>
12505 </tr>
12506 <tr><td align="left" valign="top"><p>
12507                 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&lt;T&gt; and related
12508                 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
12509                 H. Sutter, S. Mithani.
12510               </p></td></tr>
12511 </table></div>
12512 <div class="variablelist">
12513 <p class="title"><b></b></p>
12514 <dl class="variablelist">
12515 <dt><span class="term">Notes:</span></dt>
12516 <dd><p>
12517                     Removes the outermost future and returns a future with the associated
12518                     state been a proxy of the outer future.
12519                   </p></dd>
12520 <dt><span class="term">Effects:</span></dt>
12521 <dd><p>
12522                     - Returns a future that becomes ready when the shared state of
12523                     the outer and inner future is ready. The validity of the future
12524                     returned from <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> applied on the outer future
12525                     cannot be established a priori. If it is not valid, this future
12526                     is forced to be valid and becomes ready with an exception of
12527                     type <code class="computeroutput"><span class="identifier">future_error</span></code>,
12528                     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>.
12529                   </p></dd>
12530 <dt><span class="term">Returns:</span></dt>
12531 <dd><p>
12532                     An object of type future with the associated state been a proxy
12533                     of outer future.
12534                   </p></dd>
12535 <dt><span class="term">Postconditions:</span></dt>
12536 <dd><p>
12537                     - The returned future has <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
12538                     <span class="keyword">true</span></code>.
12539                   </p></dd>
12540 </dl>
12541 </div>
12542 </div>
12543 </div>
12544 <div class="section">
12545 <div class="titlepage"><div><div><h5 class="title">
12546 <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>
12547 </h5></div></div></div>
12548 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
12549 <span class="keyword">class</span> <span class="identifier">shared_future</span>
12550 <span class="special">{</span>
12551 <span class="keyword">public</span><span class="special">:</span>
12552   <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>
12553   <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>
12554
12555   <span class="identifier">shared_future</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
12556   <span class="special">~</span><span class="identifier">shared_future</span><span class="special">();</span>
12557
12558   <span class="comment">// copy support</span>
12559   <span class="identifier">shared_future</span><span class="special">(</span><span class="identifier">shared_future</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
12560   <span class="identifier">shared_future</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_future</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
12561
12562   <span class="comment">// move support</span>
12563   <span class="identifier">shared_future</span><span class="special">(</span><span class="identifier">shared_future</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12564   <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">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12565   <span class="identifier">shared_future</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">shared_future</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12566   <span class="identifier">shared_future</span><span class="special">&amp;</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">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12567
12568   <span class="comment">// factories</span>
12569   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
12570    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
12571   <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12572   <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
12573    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
12574   <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&amp;</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12575   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
12576    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
12577   <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">&amp;&amp;</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12578
12579   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
12580
12581   <span class="comment">// retrieving the value</span>
12582   <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get</span><span class="special">();</span>
12583
12584   <span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
12585
12586   <span class="comment">// functions to check state, and wait for ready</span>
12587   <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>
12588   <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>
12589   <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>
12590   <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>
12591
12592   <span class="comment">// waiting for the result to be ready</span>
12593   <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
12594   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
12595   <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12596   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
12597   <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12598
12599 <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>
12600   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
12601   <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">&amp;</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>
12602   <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">&amp;</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>
12603 <span class="preprocessor">#endif</span>
12604   <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>
12605
12606 <span class="special">};</span>
12607 </pre>
12608 <div class="section">
12609 <div class="titlepage"><div><div><h6 class="title">
12610 <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
12611             Constructor</a>
12612 </h6></div></div></div>
12613 <pre class="programlisting"><span class="identifier">shared_future</span><span class="special">();</span>
12614 </pre>
12615 <div class="variablelist">
12616 <p class="title"><b></b></p>
12617 <dl class="variablelist">
12618 <dt><span class="term">Effects:</span></dt>
12619 <dd><p>
12620                     Constructs an uninitialized shared_future.
12621                   </p></dd>
12622 <dt><span class="term">Postconditions:</span></dt>
12623 <dd><p>
12624                     <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">-&gt;</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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12625                     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>.
12626                   </p></dd>
12627 <dt><span class="term">Throws:</span></dt>
12628 <dd><p>
12629                     Nothing.
12630                   </p></dd>
12631 </dl>
12632 </div>
12633 </div>
12634 <div class="section">
12635 <div class="titlepage"><div><div><h6 class="title">
12636 <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
12637             function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a>
12638 </h6></div></div></div>
12639 <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">();</span>
12640 <span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">();</span>
12641 <span class="keyword">void</span> <span class="identifier">get</span><span class="special">();</span>
12642 </pre>
12643 <div class="variablelist">
12644 <p class="title"><b></b></p>
12645 <dl class="variablelist">
12646 <dt><span class="term">Effects:</span></dt>
12647 <dd><p>
12648                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12649                     is associated with a shared state, waits until the result is
12650                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
12651                     and returns a <code class="computeroutput"><span class="keyword">const</span></code>
12652                     reference to the result.
12653                   </p></dd>
12654 <dt><span class="term">Returns:</span></dt>
12655 <dd>
12656 <p>
12657                     - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span></code> return the stored reference.
12658                   </p>
12659 <p>
12660                     - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code>, there is no return value.
12661                   </p>
12662 <p>
12663                     - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code> returns a <code class="computeroutput"><span class="keyword">const</span></code>
12664                     reference to the value stored in the shared state.
12665                   </p>
12666 </dd>
12667 <dt><span class="term">Throws:</span></dt>
12668 <dd>
12669 <p>
12670                     - <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>
12671                     is not associated with a shared state.
12672                   </p>
12673 <p>
12674                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12675                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12676                     of the call, and the current thread is interrupted.
12677                   </p>
12678 </dd>
12679 <dt><span class="term">Notes:</span></dt>
12680 <dd><p>
12681                     <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
12682                     is an <span class="emphasis"><em>interruption point</em></span>.
12683                   </p></dd>
12684 </dl>
12685 </div>
12686 </div>
12687 <div class="section">
12688 <div class="titlepage"><div><div><h6 class="title">
12689 <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
12690             function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
12691 </h6></div></div></div>
12692 <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>
12693 </pre>
12694 <div class="variablelist">
12695 <p class="title"><b></b></p>
12696 <dl class="variablelist">
12697 <dt><span class="term">Effects:</span></dt>
12698 <dd><p>
12699                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12700                     is associated with a shared state, waits until the result is
12701                     ready. If the result is not ready on entry, and the result has
12702                     a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
12703                     prior to waiting.
12704                   </p></dd>
12705 <dt><span class="term">Throws:</span></dt>
12706 <dd>
12707 <p>
12708                     - <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>
12709                     is not associated with a shared state.
12710                   </p>
12711 <p>
12712                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12713                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12714                     of the call, and the current thread is interrupted.
12715                   </p>
12716 <p>
12717                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12718                     if such a callback is called.
12719                   </p>
12720 </dd>
12721 <dt><span class="term">Postconditions:</span></dt>
12722 <dd><p>
12723                     <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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12724                     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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12725                     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>.
12726                   </p></dd>
12727 <dt><span class="term">Notes:</span></dt>
12728 <dd><p>
12729                     <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
12730                     is an <span class="emphasis"><em>interruption point</em></span>.
12731                   </p></dd>
12732 </dl>
12733 </div>
12734 </div>
12735 <div class="section">
12736 <div class="titlepage"><div><div><h6 class="title">
12737 <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
12738             function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code></a>
12739 </h6></div></div></div>
12740 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
12741 <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">&amp;</span> <span class="identifier">wait_duration</span><span class="special">);</span>
12742 </pre>
12743 <div class="variablelist">
12744 <p class="title"><b></b></p>
12745 <dl class="variablelist">
12746 <dt><span class="term">Effects:</span></dt>
12747 <dd><p>
12748                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12749                     is associated with a shared state, waits until the result is
12750                     ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
12751                     has elapsed. If the result is not ready on entry, and the result
12752                     has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12753                     invoked prior to waiting.
12754                   </p></dd>
12755 <dt><span class="term">Returns:</span></dt>
12756 <dd><p>
12757                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12758                     is associated with a shared state, and that result is ready before
12759                     the specified time has elapsed, <code class="computeroutput"><span class="keyword">false</span></code>
12760                     otherwise.
12761                   </p></dd>
12762 <dt><span class="term">Throws:</span></dt>
12763 <dd>
12764 <p>
12765                     - <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>
12766                     is not associated with a shared state.
12767                   </p>
12768 <p>
12769                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12770                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12771                     of the call, and the current thread is interrupted.
12772                   </p>
12773 <p>
12774                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12775                     if such a callback is called.
12776                   </p>
12777 </dd>
12778 <dt><span class="term">Postconditions:</span></dt>
12779 <dd><p>
12780                     If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12781                     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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12782                     returns <code class="computeroutput"><span class="keyword">true</span></code> and
12783                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12784                     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>.
12785                   </p></dd>
12786 <dt><span class="term">Notes:</span></dt>
12787 <dd><p>
12788                     <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12789                     is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
12790                     meets the Boost.DateTime time duration requirements.
12791                   </p></dd>
12792 </dl>
12793 </div>
12794 </div>
12795 <div class="section">
12796 <div class="titlepage"><div><div><h6 class="title">
12797 <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
12798             function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code></a>
12799 </h6></div></div></div>
12800 <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">&amp;</span> <span class="identifier">wait_timeout</span><span class="special">);</span>
12801 </pre>
12802 <div class="variablelist">
12803 <p class="title"><b></b></p>
12804 <dl class="variablelist">
12805 <dt><span class="term">Effects:</span></dt>
12806 <dd><p>
12807                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12808                     is associated with a shared state, waits until the result is
12809                     ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
12810                     has passed. If the result is not ready on entry, and the result
12811                     has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12812                     invoked prior to waiting.
12813                   </p></dd>
12814 <dt><span class="term">Returns:</span></dt>
12815 <dd><p>
12816                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12817                     is associated with a shared state, and that result is ready before
12818                     the specified time has passed, <code class="computeroutput"><span class="keyword">false</span></code>
12819                     otherwise.
12820                   </p></dd>
12821 <dt><span class="term">Throws:</span></dt>
12822 <dd>
12823 <p>
12824                     - <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>
12825                     is not associated with a shared state.
12826                   </p>
12827 <p>
12828                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12829                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12830                     of the call, and the current thread is interrupted.
12831                   </p>
12832 <p>
12833                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12834                     if such a callback is called.
12835                   </p>
12836 </dd>
12837 <dt><span class="term">Postconditions:</span></dt>
12838 <dd><p>
12839                     If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12840                     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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12841                     returns <code class="computeroutput"><span class="keyword">true</span></code> and
12842                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12843                     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>.
12844                   </p></dd>
12845 <dt><span class="term">Notes:</span></dt>
12846 <dd><p>
12847                     <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12848                     is an <span class="emphasis"><em>interruption point</em></span>.
12849                   </p></dd>
12850 </dl>
12851 </div>
12852 </div>
12853 <div class="section">
12854 <div class="titlepage"><div><div><h6 class="title">
12855 <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
12856             function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code></a>
12857 </h6></div></div></div>
12858 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
12859 <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">&lt;</span><span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span><span class="special">&gt;&amp;</span> <span class="identifier">rel_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12860 </pre>
12861 <div class="variablelist">
12862 <p class="title"><b></b></p>
12863 <dl class="variablelist">
12864 <dt><span class="term">Effects:</span></dt>
12865 <dd><p>
12866                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12867                     is associated with a shared state, waits until the result is
12868                     ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
12869                     has elapsed. If the result is not ready on entry, and the result
12870                     has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12871                     invoked prior to waiting.
12872                   </p></dd>
12873 <dt><span class="term">Returns:</span></dt>
12874 <dd>
12875 <p>
12876                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12877                     if the shared state contains a deferred function. (Not implemented
12878                     yet)
12879                   </p>
12880 <p>
12881                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12882                     if the shared state is ready.
12883                   </p>
12884 <p>
12885                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12886                     if the function is returning because the relative timeout specified
12887                     by <code class="computeroutput"><span class="identifier">rel_time</span></code> has
12888                     expired.
12889                   </p>
12890 </dd>
12891 <dt><span class="term">Throws:</span></dt>
12892 <dd>
12893 <p>
12894                     - <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>
12895                     is not associated with a shared state.
12896                   </p>
12897 <p>
12898                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12899                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12900                     of the call, and the current thread is interrupted.
12901                   </p>
12902 <p>
12903                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12904                     if such a callback is called.
12905                   </p>
12906 </dd>
12907 <dt><span class="term">Postconditions:</span></dt>
12908 <dd><p>
12909                     If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12910                     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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12911                     returns <code class="computeroutput"><span class="keyword">true</span></code> and
12912                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12913                     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>.
12914                   </p></dd>
12915 <dt><span class="term">Notes:</span></dt>
12916 <dd><p>
12917                     <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12918                     is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
12919                     meets the Boost.DateTime time duration requirements.
12920                   </p></dd>
12921 </dl>
12922 </div>
12923 </div>
12924 <div class="section">
12925 <div class="titlepage"><div><div><h6 class="title">
12926 <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
12927             function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
12928 </h6></div></div></div>
12929 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
12930 <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">&lt;</span><span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span><span class="special">&gt;&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
12931 </pre>
12932 <div class="variablelist">
12933 <p class="title"><b></b></p>
12934 <dl class="variablelist">
12935 <dt><span class="term">Effects:</span></dt>
12936 <dd><p>
12937                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12938                     is associated with a shared state, waits until the result is
12939                     ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
12940                     has passed. If the result is not ready on entry, and the result
12941                     has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12942                     invoked prior to waiting.
12943                   </p></dd>
12944 <dt><span class="term">Returns:</span></dt>
12945 <dd>
12946 <p>
12947                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12948                     if the shared state contains a deferred function. (Not implemented
12949                     yet)
12950                   </p>
12951 <p>
12952                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12953                     if the shared state is ready.
12954                   </p>
12955 <p>
12956                     - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12957                     if the function is returning because the absolute timeout specified
12958                     by <code class="computeroutput"><span class="identifier">absl_time</span></code>
12959                     has reached.
12960                   </p>
12961 </dd>
12962 <dt><span class="term">Throws:</span></dt>
12963 <dd>
12964 <p>
12965                     - <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>
12966                     is not associated with a shared state.
12967                   </p>
12968 <p>
12969                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12970                     associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12971                     of the call, and the current thread is interrupted.
12972                   </p>
12973 <p>
12974                     - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12975                     if such a callback is called.
12976                   </p>
12977 </dd>
12978 <dt><span class="term">Postconditions:</span></dt>
12979 <dd><p>
12980                     If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12981                     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">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12982                     returns <code class="computeroutput"><span class="keyword">true</span></code> and
12983                     <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">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12984                     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>.
12985                   </p></dd>
12986 <dt><span class="term">Notes:</span></dt>
12987 <dd><p>
12988                     <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12989                     is an <span class="emphasis"><em>interruption point</em></span>.
12990                   </p></dd>
12991 </dl>
12992 </div>
12993 </div>
12994 <div class="section">
12995 <div class="titlepage"><div><div><h6 class="title">
12996 <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
12997             function <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span></code></a>
12998 </h6></div></div></div>
12999 <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>
13000 </pre>
13001 <div class="variablelist">
13002 <p class="title"><b></b></p>
13003 <dl class="variablelist">
13004 <dt><span class="term">Returns:</span></dt>
13005 <dd><p>
13006                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13007                     is associated with a shared state, <code class="computeroutput"><span class="keyword">false</span></code>
13008                     otherwise.
13009                   </p></dd>
13010 <dt><span class="term">Throws:</span></dt>
13011 <dd><p>
13012                     Nothing.
13013                   </p></dd>
13014 </dl>
13015 </div>
13016 </div>
13017 <div class="section">
13018 <div class="titlepage"><div><div><h6 class="title">
13019 <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
13020             function <code class="computeroutput"><span class="identifier">is_ready</span><span class="special">()</span></code>
13021             EXTENSION</a>
13022 </h6></div></div></div>
13023 <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>
13024 </pre>
13025 <div class="variablelist">
13026 <p class="title"><b></b></p>
13027 <dl class="variablelist">
13028 <dt><span class="term">Returns:</span></dt>
13029 <dd><p>
13030                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13031                     is associated with a shared state, and that result is ready for
13032                     retrieval, <code class="computeroutput"><span class="keyword">false</span></code>
13033                     otherwise.
13034                   </p></dd>
13035 <dt><span class="term">Throws:</span></dt>
13036 <dd><p>
13037                     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.
13038                   </p></dd>
13039 </dl>
13040 </div>
13041 </div>
13042 <div class="section">
13043 <div class="titlepage"><div><div><h6 class="title">
13044 <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
13045             function <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code>
13046             EXTENSION</a>
13047 </h6></div></div></div>
13048 <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>
13049 </pre>
13050 <div class="variablelist">
13051 <p class="title"><b></b></p>
13052 <dl class="variablelist">
13053 <dt><span class="term">Returns:</span></dt>
13054 <dd><p>
13055                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13056                     is associated with a shared state, that result is ready for retrieval,
13057                     and the result is a stored value, <code class="computeroutput"><span class="keyword">false</span></code>
13058                     otherwise.
13059                   </p></dd>
13060 <dt><span class="term">Throws:</span></dt>
13061 <dd><p>
13062                     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.
13063                   </p></dd>
13064 </dl>
13065 </div>
13066 </div>
13067 <div class="section">
13068 <div class="titlepage"><div><div><h6 class="title">
13069 <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
13070             function <code class="computeroutput"><span class="identifier">has_exception</span><span class="special">()</span></code> EXTENSION</a>
13071 </h6></div></div></div>
13072 <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>
13073 </pre>
13074 <div class="variablelist">
13075 <p class="title"><b></b></p>
13076 <dl class="variablelist">
13077 <dt><span class="term">Returns:</span></dt>
13078 <dd><p>
13079                     <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13080                     is associated with a shared state, that result is ready for retrieval,
13081                     and the result is a stored exception, <code class="computeroutput"><span class="keyword">false</span></code>
13082                     otherwise.
13083                   </p></dd>
13084 <dt><span class="term">Throws:</span></dt>
13085 <dd><p>
13086                     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.
13087                   </p></dd>
13088 </dl>
13089 </div>
13090 </div>
13091 <div class="section">
13092 <div class="titlepage"><div><div><h6 class="title">
13093 <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
13094             function <code class="computeroutput"><span class="identifier">get_exception_ptr</span><span class="special">()</span></code> EXTENSION</a>
13095 </h6></div></div></div>
13096 <pre class="programlisting"><span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span>
13097 </pre>
13098 <div class="variablelist">
13099 <p class="title"><b></b></p>
13100 <dl class="variablelist">
13101 <dt><span class="term">Effects:</span></dt>
13102 <dd><p>
13103                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13104                     is associated with a shared state, waits until the result is
13105                     ready. If the result is not ready on entry, and the result has
13106                     a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
13107                     prior to waiting.
13108                   </p></dd>
13109 <dt><span class="term">Returns:</span></dt>
13110 <dd><p>
13111                     a exception_ptr, storring or not an exception.
13112                   </p></dd>
13113 <dt><span class="term">Throws:</span></dt>
13114 <dd><p>
13115                     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.
13116                   </p></dd>
13117 </dl>
13118 </div>
13119 </div>
13120 <div class="section">
13121 <div class="titlepage"><div><div><h6 class="title">
13122 <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
13123             function <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code>
13124             EXTENSION</a>
13125 </h6></div></div></div>
13126 <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>
13127 </pre>
13128 <div class="variablelist">
13129 <p class="title"><b></b></p>
13130 <dl class="variablelist">
13131 <dt><span class="term">Effects:</span></dt>
13132 <dd><p>
13133                     Determine the state of the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13134                     if any.
13135                   </p></dd>
13136 <dt><span class="term">Returns:</span></dt>
13137 <dd><p>
13138                     <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>
13139                     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
13140                     state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready for retrieval,
13141                     <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.
13142                   </p></dd>
13143 <dt><span class="term">Throws:</span></dt>
13144 <dd><p>
13145                     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.
13146                   </p></dd>
13147 </dl>
13148 </div>
13149 </div>
13150 <div class="section">
13151 <div class="titlepage"><div><div><h6 class="title">
13152 <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
13153             function <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code>
13154             EXTENSION</a>
13155 </h6></div></div></div>
13156 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
13157  <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
13158 <span class="identifier">then</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13159 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
13160  <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
13161 <span class="identifier">then</span><span class="special">(</span><span class="identifier">S</span><span class="special">&amp;</span> <span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13162 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
13163  <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
13164 <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">&amp;&amp;</span> <span class="identifier">func</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13165 </pre>
13166 <div class="warning"><table border="0" summary="Warning">
13167 <tr>
13168 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
13169 <th align="left">Warning</th>
13170 </tr>
13171 <tr><td align="left" valign="top"><p>
13172                 These functions are experimental and subject to change in future
13173                 versions. There are not too much tests yet, so it is possible that
13174                 you can find out some trivial bugs :(
13175               </p></td></tr>
13176 </table></div>
13177 <div class="note"><table border="0" summary="Note">
13178 <tr>
13179 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
13180 <th align="left">Note</th>
13181 </tr>
13182 <tr><td align="left" valign="top"><p>
13183                 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&lt;T&gt; and related
13184                 APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
13185                 H. Sutter, S. Mithani.
13186               </p></td></tr>
13187 </table></div>
13188 <div class="variablelist">
13189 <p class="title"><b></b></p>
13190 <dl class="variablelist">
13191 <dt><span class="term">Notes:</span></dt>
13192 <dd><p>
13193                     The three functions differ only by input parameters. The first
13194                     only takes a callable object which accepts a shared_future object
13195                     as a parameter. The second function takes a scheduler as the
13196                     first parameter and a callable object as the second parameter.
13197                     The third function takes a launch policy as the first parameter
13198                     and a callable object as the second parameter.
13199                   </p></dd>
13200 <dt><span class="term">Effects:</span></dt>
13201 <dd>
13202 <p>
13203                     - The continuation is called when the object's shared state is
13204                     ready (has a value or exception stored).
13205                   </p>
13206 <p>
13207                     - The continuation launches according to the specified policy
13208                     or scheduler.
13209                   </p>
13210 <p>
13211                     - When the scheduler or launch policy is not provided the continuation
13212                     inherits the parent's launch policy or scheduler.
13213                   </p>
13214 <p>
13215                     - If the parent was created with <code class="computeroutput"><span class="identifier">promise</span></code>
13216                     or with a <code class="computeroutput"><span class="identifier">packaged_task</span></code>
13217                     (has no associated launch policy), the continuation behaves the
13218                     same as the third overload with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span> <span class="special">|</span>
13219                     <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> and the same argument
13220                     for func.
13221                   </p>
13222 <p>
13223                     - 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>
13224                     and the continuation does not have a specified launch policy
13225                     or scheduler, then the parent is filled by immediately calling
13226                     <code class="computeroutput"><span class="special">.</span><span class="identifier">wait</span><span class="special">()</span></code>, and the policy of the antecedent
13227                     is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
13228                   </p>
13229 </dd>
13230 <dt><span class="term">Returns:</span></dt>
13231 <dd><p>
13232                     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">&lt;</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">)&gt;</span></code> that refers to the shared
13233                     state created by the continuation.
13234                   </p></dd>
13235 <dt><span class="term">Notes:</span></dt>
13236 <dd>
13237 <p>
13238                     - Note that nested futures are not implicitly unwrapped yet.
13239                     This could be subject to change in future versions.
13240                   </p>
13241 <p>
13242                     - The returned futures behave as the ones returned from boost::async,
13243                     the destructor of the future object returned from then will block.
13244                     This could be subject to change in future versions.
13245                   </p>
13246 </dd>
13247 <dt><span class="term">Postconditions:</span></dt>
13248 <dd>
13249 <p>
13250                     - The future object is moved to the parameter of the continuation
13251                     function .
13252                   </p>
13253 <p>
13254                     - <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
13255                     <span class="special">==</span> <span class="keyword">true</span></code>
13256                     on original <code class="computeroutput"><span class="identifier">shared_future</span></code>;
13257                     <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
13258                     <span class="special">==</span> <span class="keyword">true</span></code>
13259                     on the <code class="computeroutput"><span class="identifier">future</span></code>
13260                     returned from then.
13261                   </p>
13262 </dd>
13263 </dl>
13264 </div>
13265 </div>
13266 </div>
13267 <div class="section">
13268 <div class="titlepage"><div><div><h5 class="title">
13269 <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>
13270 </h5></div></div></div>
13271 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
13272 <span class="keyword">class</span> <span class="identifier">promise</span>
13273 <span class="special">{</span>
13274 <span class="keyword">public</span><span class="special">:</span>
13275   <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>
13276
13277   <span class="identifier">promise</span><span class="special">();</span>
13278   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
13279   <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>
13280   <span class="identifier">promise</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
13281   <span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
13282   <span class="special">~</span><span class="identifier">promise</span><span class="special">();</span>
13283
13284   <span class="comment">// Move support</span>
13285   <span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;;</span>
13286   <span class="identifier">promise</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;;</span>
13287
13288   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">promise</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13289   <span class="comment">// Result retrieval</span>
13290    <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">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
13291
13292   <span class="comment">// Set the value</span>
13293   <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>
13294   <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>
13295   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
13296   <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>
13297
13298   <span class="comment">// setting the result with deferred notification</span>
13299   <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>
13300   <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>
13301   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
13302   <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>
13303
13304   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
13305   <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>
13306 <span class="special">};</span>
13307 </pre>
13308 <div class="section">
13309 <div class="titlepage"><div><div><h6 class="title">
13310 <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
13311             Constructor</a>
13312 </h6></div></div></div>
13313 <pre class="programlisting"><span class="identifier">promise</span><span class="special">();</span>
13314 </pre>
13315 <div class="variablelist">
13316 <p class="title"><b></b></p>
13317 <dl class="variablelist">
13318 <dt><span class="term">Effects:</span></dt>
13319 <dd><p>
13320                     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
13321                     result.
13322                   </p></dd>
13323 <dt><span class="term">Throws:</span></dt>
13324 <dd><p>
13325                     Nothing.
13326                   </p></dd>
13327 </dl>
13328 </div>
13329 </div>
13330 <div class="section">
13331 <div class="titlepage"><div><div><h6 class="title">
13332 <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
13333             Constructor</a>
13334 </h6></div></div></div>
13335 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
13336 <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>
13337 </pre>
13338 <div class="variablelist">
13339 <p class="title"><b></b></p>
13340 <dl class="variablelist">
13341 <dt><span class="term">Effects:</span></dt>
13342 <dd><p>
13343                     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
13344                     result using the allocator <code class="computeroutput"><span class="identifier">a</span></code>.
13345                   </p></dd>
13346 <dt><span class="term">Throws:</span></dt>
13347 <dd><p>
13348                     Nothing.
13349                   </p></dd>
13350 <dt><span class="term">Notes:</span></dt>
13351 <dd><p>
13352                     Available only if BOOST_THREAD_FUTURE_USES_ALLOCATORS is defined.
13353                   </p></dd>
13354 </dl>
13355 </div>
13356 </div>
13357 <div class="section">
13358 <div class="titlepage"><div><div><h6 class="title">
13359 <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
13360             Constructor</a>
13361 </h6></div></div></div>
13362 <pre class="programlisting"><span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
13363 </pre>
13364 <div class="variablelist">
13365 <p class="title"><b></b></p>
13366 <dl class="variablelist">
13367 <dt><span class="term">Effects:</span></dt>
13368 <dd><p>
13369                     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
13370                     ownership of the result associated with <code class="computeroutput"><span class="identifier">other</span></code>
13371                     to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13372                     leaving <code class="computeroutput"><span class="identifier">other</span></code>
13373                     with no associated result.
13374                   </p></dd>
13375 <dt><span class="term">Throws:</span></dt>
13376 <dd><p>
13377                     Nothing.
13378                   </p></dd>
13379 <dt><span class="term">Notes:</span></dt>
13380 <dd><p>
13381                     If the compiler does not support rvalue-references, this is implemented
13382                     using the boost.thread move emulation.
13383                   </p></dd>
13384 </dl>
13385 </div>
13386 </div>
13387 <div class="section">
13388 <div class="titlepage"><div><div><h6 class="title">
13389 <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
13390             Assignment Operator</a>
13391 </h6></div></div></div>
13392 <pre class="programlisting"><span class="identifier">promise</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">promise</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
13393 </pre>
13394 <div class="variablelist">
13395 <p class="title"><b></b></p>
13396 <dl class="variablelist">
13397 <dt><span class="term">Effects:</span></dt>
13398 <dd><p>
13399                     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>
13400                     with no associated result. If there was already a result associated
13401                     with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13402                     and that result was not <span class="emphasis"><em>ready</em></span>, sets any
13403                     futures associated with that result to <span class="emphasis"><em>ready</em></span>
13404                     with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code>
13405                     exception as the result.
13406                   </p></dd>
13407 <dt><span class="term">Throws:</span></dt>
13408 <dd><p>
13409                     Nothing.
13410                   </p></dd>
13411 <dt><span class="term">Notes:</span></dt>
13412 <dd><p>
13413                     If the compiler does not support rvalue-references, this is implemented
13414                     using the boost.thread move emulation.
13415                   </p></dd>
13416 </dl>
13417 </div>
13418 </div>
13419 <div class="section">
13420 <div class="titlepage"><div><div><h6 class="title">
13421 <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>
13422 </h6></div></div></div>
13423 <pre class="programlisting"><span class="special">~</span><span class="identifier">promise</span><span class="special">();</span>
13424 </pre>
13425 <div class="variablelist">
13426 <p class="title"><b></b></p>
13427 <dl class="variablelist">
13428 <dt><span class="term">Effects:</span></dt>
13429 <dd><p>
13430                     Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13431                     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
13432                     <span class="emphasis"><em>ready</em></span>, sets any futures associated with
13433                     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
13434                     the result.
13435                   </p></dd>
13436 <dt><span class="term">Throws:</span></dt>
13437 <dd><p>
13438                     Nothing.
13439                   </p></dd>
13440 </dl>
13441 </div>
13442 </div>
13443 <div class="section">
13444 <div class="titlepage"><div><div><h6 class="title">
13445 <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
13446             Function <code class="computeroutput"><span class="identifier">get_future</span><span class="special">()</span></code></a>
13447 </h6></div></div></div>
13448 <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">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
13449 </pre>
13450 <div class="variablelist">
13451 <p class="title"><b></b></p>
13452 <dl class="variablelist">
13453 <dt><span class="term">Effects:</span></dt>
13454 <dd><p>
13455                     If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13456                     was not associated with a result, allocate storage for a new
13457                     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
13458                     the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13459                   </p></dd>
13460 <dt><span class="term">Throws:</span></dt>
13461 <dd><p>
13462                     <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_already_retrieved</span></code> if
13463                     the future associated with the task has already been retrieved.
13464                     <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if any memory necessary
13465                     could not be allocated.
13466                   </p></dd>
13467 </dl>
13468 </div>
13469 </div>
13470 <div class="section">
13471 <div class="titlepage"><div><div><h6 class="title">
13472 <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
13473             Function <code class="computeroutput"><span class="identifier">set_value</span><span class="special">()</span></code></a>
13474 </h6></div></div></div>
13475 <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">&amp;&amp;</span> <span class="identifier">r</span><span class="special">);</span>
13476 <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">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
13477 <span class="keyword">void</span> <span class="identifier">promise</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&amp;&gt;::</span><span class="identifier">set_value</span><span class="special">(</span><span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
13478 <span class="keyword">void</span> <span class="identifier">promise</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">set_value</span><span class="special">();</span>
13479 </pre>
13480 <div class="variablelist">
13481 <p class="title"><b></b></p>
13482 <dl class="variablelist">
13483 <dt><span class="term">Effects:</span></dt>
13484 <dd>
13485 <p>
13486                     - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13487                     was not associated with a result, allocate storage for a new
13488                     shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13489                   </p>
13490 <p>
13491                     - Store the value <code class="computeroutput"><span class="identifier">r</span></code>
13492                     in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Any threads blocked waiting
13493                     for the asynchronous result are woken.
13494                   </p>
13495 </dd>
13496 <dt><span class="term">Postconditions:</span></dt>
13497 <dd><p>
13498                     All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
13499                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_value</span><span class="special">()</span></code></a>
13500                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_value</span><span class="special">()</span></code></a>
13501                     for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
13502                   </p></dd>
13503 <dt><span class="term">Throws:</span></dt>
13504 <dd>
13505 <p>
13506                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
13507                     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>.
13508                   </p>
13509 <p>
13510                     - <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>
13511                     has no shared state.
13512                   </p>
13513 <p>
13514                     - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
13515                     for storage of the result cannot be allocated.
13516                   </p>
13517 <p>
13518                     - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>.
13519                   </p>
13520 </dd>
13521 </dl>
13522 </div>
13523 </div>
13524 <div class="section">
13525 <div class="titlepage"><div><div><h6 class="title">
13526 <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
13527             Function <code class="computeroutput"><span class="identifier">set_exception</span><span class="special">()</span></code></a>
13528 </h6></div></div></div>
13529 <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>
13530 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
13531 <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>
13532 </pre>
13533 <div class="variablelist">
13534 <p class="title"><b></b></p>
13535 <dl class="variablelist">
13536 <dt><span class="term">Effects:</span></dt>
13537 <dd>
13538 <p>
13539                     - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13540                     was not associated with a result, allocate storage for a new
13541                     shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13542                   </p>
13543 <p>
13544                     - Store the exception <code class="computeroutput"><span class="identifier">e</span></code>
13545                     in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Any threads blocked waiting
13546                     for the asynchronous result are woken.
13547                   </p>
13548 </dd>
13549 <dt><span class="term">Postconditions:</span></dt>
13550 <dd><p>
13551                     All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
13552                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
13553                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
13554                     for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
13555                   </p></dd>
13556 <dt><span class="term">Throws:</span></dt>
13557 <dd>
13558 <p>
13559                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
13560                     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>.
13561                   </p>
13562 <p>
13563                     - <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>
13564                     has no shared state.
13565                   </p>
13566 <p>
13567                     - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
13568                     for storage of the result cannot be allocated.
13569                   </p>
13570 </dd>
13571 </dl>
13572 </div>
13573 </div>
13574 <div class="section">
13575 <div class="titlepage"><div><div><h6 class="title">
13576 <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
13577             Function <code class="computeroutput"><span class="identifier">set_value_at_thread_exit</span><span class="special">()</span></code></a>
13578 </h6></div></div></div>
13579 <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">&amp;&amp;</span> <span class="identifier">r</span><span class="special">);</span>
13580 <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">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
13581 <span class="keyword">void</span> <span class="identifier">promise</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&amp;&gt;::</span><span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
13582 <span class="keyword">void</span> <span class="identifier">promise</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">set_value_at_thread_exit</span><span class="special">();</span>
13583 </pre>
13584 <div class="variablelist">
13585 <p class="title"><b></b></p>
13586 <dl class="variablelist">
13587 <dt><span class="term">Effects:</span></dt>
13588 <dd><p>
13589                     Stores the value r in the shared state without making that state
13590                     ready immediately. Schedules that state to be made ready when
13591                     the current thread exits, after all objects of thread storage
13592                     duration associated with the current thread have been destroyed.
13593                   </p></dd>
13594 <dt><span class="term">Throws:</span></dt>
13595 <dd>
13596 <p>
13597                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
13598                     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>.
13599                   </p>
13600 <p>
13601                     - <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>
13602                     has no shared state.
13603                   </p>
13604 <p>
13605                     - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
13606                     for storage of the result cannot be allocated.
13607                   </p>
13608 <p>
13609                     - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>.
13610                   </p>
13611 </dd>
13612 </dl>
13613 </div>
13614 </div>
13615 <div class="section">
13616 <div class="titlepage"><div><div><h6 class="title">
13617 <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
13618             Function <code class="computeroutput"><span class="identifier">set_exception_at_thread_exit</span><span class="special">()</span></code></a>
13619 </h6></div></div></div>
13620 <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>
13621 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
13622 <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>
13623 </pre>
13624 <div class="variablelist">
13625 <p class="title"><b></b></p>
13626 <dl class="variablelist">
13627 <dt><span class="term">Effects:</span></dt>
13628 <dd><p>
13629                     Stores the exception pointer p in the shared state without making
13630                     that state ready immediately. Schedules that state to be made
13631                     ready when the current thread exits, after all objects of thread
13632                     storage duration associated with the current thread have been
13633                     destroyed.
13634                   </p></dd>
13635 <dt><span class="term">Postconditions:</span></dt>
13636 <dd><p>
13637                     All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
13638                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
13639                     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">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
13640                     for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
13641                   </p></dd>
13642 <dt><span class="term">Throws:</span></dt>
13643 <dd>
13644 <p>
13645                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
13646                     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>.
13647                   </p>
13648 <p>
13649                     - <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>
13650                     has no shared state.
13651                   </p>
13652 <p>
13653                     - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
13654                     for storage of the result cannot be allocated.
13655                   </p>
13656 </dd>
13657 </dl>
13658 </div>
13659 </div>
13660 <div class="section">
13661 <div class="titlepage"><div><div><h6 class="title">
13662 <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
13663             Function <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> EXTENSION</a>
13664 </h6></div></div></div>
13665 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
13666 <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>
13667 </pre>
13668 <div class="variablelist">
13669 <p class="title"><b></b></p>
13670 <dl class="variablelist">
13671 <dt><span class="term">Preconditions:</span></dt>
13672 <dd><p>
13673                     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>
13674                     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.
13675                     Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code>
13676                     shall have the same effect as invoking <code class="computeroutput"><span class="identifier">f</span></code>
13677                   </p></dd>
13678 <dt><span class="term">Effects:</span></dt>
13679 <dd><p>
13680                     Store a copy of <code class="computeroutput"><span class="identifier">f</span></code>
13681                     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>.
13682                     This will replace any existing wait callback store alongside
13683                     that result. If a thread subsequently calls one of the wait functions
13684                     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
13685                     with this result, and the result is not <span class="emphasis"><em>ready</em></span>,
13686                     <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>
13687                     shall be invoked.
13688                   </p></dd>
13689 <dt><span class="term">Throws:</span></dt>
13690 <dd><p>
13691                     <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory cannot
13692                     be allocated for the required storage.
13693                   </p></dd>
13694 </dl>
13695 </div>
13696 </div>
13697 </div>
13698 <div class="section">
13699 <div class="titlepage"><div><div><h5 class="title">
13700 <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>
13701 </h5></div></div></div>
13702 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">&gt;</span>
13703 <span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">;</span>
13704 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span>
13705   <span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">ArgTypes</span>
13706 <span class="special">&gt;</span>
13707 <span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">)&gt;</span>
13708 <span class="special">{</span>
13709 <span class="keyword">public</span><span class="special">:</span>
13710   <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
13711   <span class="identifier">packaged_task</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
13712
13713   <span class="comment">// construction and destruction</span>
13714   <span class="identifier">packaged_task</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
13715
13716   <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>
13717
13718   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
13719   <span class="keyword">explicit</span> <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
13720
13721   <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
13722   <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>
13723   <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
13724   <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">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
13725
13726   <span class="special">~</span><span class="identifier">packaged_task</span><span class="special">()</span>
13727   <span class="special">{}</span>
13728
13729   <span class="comment">// move support</span>
13730   <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13731   <span class="identifier">packaged_task</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13732
13733   <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13734
13735   <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>
13736   <span class="comment">// result retrieval</span>
13737    <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">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
13738
13739   <span class="comment">// execution</span>
13740   <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>
13741   <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>
13742
13743   <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
13744   <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
13745   <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>
13746 <span class="special">};</span>
13747 </pre>
13748 <div class="section">
13749 <div class="titlepage"><div><div><h6 class="title">
13750 <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
13751             Constructor</a>
13752 </h6></div></div></div>
13753 <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>
13754
13755 <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
13756 <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span><span class="identifier">f</span><span class="special">);</span>
13757 </pre>
13758 <div class="variablelist">
13759 <p class="title"><b></b></p>
13760 <dl class="variablelist">
13761 <dt><span class="term">Preconditions:</span></dt>
13762 <dd><p>
13763                     <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code>
13764                     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
13765                     <code class="computeroutput"><span class="identifier">f</span></code>.
13766                   </p></dd>
13767 <dt><span class="term">Effects:</span></dt>
13768 <dd><p>
13769                     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
13770                     <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)</span></code>
13771                     stored as the associated task.
13772                   </p></dd>
13773 <dt><span class="term">Throws:</span></dt>
13774 <dd>
13775 <p>
13776                     - Any exceptions thrown by the copy (or move) constructor of
13777                     <code class="computeroutput"><span class="identifier">f</span></code>.
13778                   </p>
13779 <p>
13780                     - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory for the
13781                     internal data structures could not be allocated.
13782                   </p>
13783 </dd>
13784 <dt><span class="term">Notes:</span></dt>
13785 <dd><p>
13786                     The R(*f)(ArgTypes...)) overload to allow passing a function
13787                     without needing to use <code class="computeroutput"><span class="special">&amp;</span></code>.
13788                   </p></dd>
13789 <dt><span class="term">Remark:</span></dt>
13790 <dd><p>
13791                     This constructor doesn't participate in overload resolution if
13792                     decay&lt;F&gt;::type is the same type as boost::packaged_task&lt;R&gt;.
13793                   </p></dd>
13794 </dl>
13795 </div>
13796 </div>
13797 <div class="section">
13798 <div class="titlepage"><div><div><h6 class="title">
13799 <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
13800             Constructor</a>
13801 </h6></div></div></div>
13802 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
13803 <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>
13804 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
13805 <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">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
13806 </pre>
13807 <div class="variablelist">
13808 <p class="title"><b></b></p>
13809 <dl class="variablelist">
13810 <dt><span class="term">Preconditions:</span></dt>
13811 <dd><p>
13812                     <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code>
13813                     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
13814                     invoking <code class="computeroutput"><span class="identifier">f</span></code>.
13815                   </p></dd>
13816 <dt><span class="term">Effects:</span></dt>
13817 <dd><p>
13818                     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
13819                     <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)</span></code>
13820                     stored as the associated task using the allocator <code class="computeroutput"><span class="identifier">a</span></code>.
13821                   </p></dd>
13822 <dt><span class="term">Throws:</span></dt>
13823 <dd><p>
13824                     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>
13825                     if memory for the internal data structures could not be allocated.
13826                   </p></dd>
13827 <dt><span class="term">Notes:</span></dt>
13828 <dd><p>
13829                     Available only if BOOST_THREAD_FUTURE_USES_ALLOCATORS is defined.
13830                   </p></dd>
13831 <dt><span class="term">Notes:</span></dt>
13832 <dd><p>
13833                     The R(*f)(ArgTypes...)) overload to allow passing a function
13834                     without needing to use <code class="computeroutput"><span class="special">&amp;</span></code>.
13835                   </p></dd>
13836 </dl>
13837 </div>
13838 </div>
13839 <div class="section">
13840 <div class="titlepage"><div><div><h6 class="title">
13841 <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
13842             Constructor</a>
13843 </h6></div></div></div>
13844 <pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
13845 </pre>
13846 <div class="variablelist">
13847 <p class="title"><b></b></p>
13848 <dl class="variablelist">
13849 <dt><span class="term">Effects:</span></dt>
13850 <dd><p>
13851                     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
13852                     ownership of the task associated with <code class="computeroutput"><span class="identifier">other</span></code>
13853                     to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13854                     leaving <code class="computeroutput"><span class="identifier">other</span></code>
13855                     with no associated task.
13856                   </p></dd>
13857 <dt><span class="term">Throws:</span></dt>
13858 <dd><p>
13859                     Nothing.
13860                   </p></dd>
13861 <dt><span class="term">Notes:</span></dt>
13862 <dd><p>
13863                     If the compiler does not support rvalue-references, this is implemented
13864                     using the boost.thread move emulation.
13865                   </p></dd>
13866 </dl>
13867 </div>
13868 </div>
13869 <div class="section">
13870 <div class="titlepage"><div><div><h6 class="title">
13871 <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
13872             Assignment Operator</a>
13873 </h6></div></div></div>
13874 <pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">packaged_task</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
13875 </pre>
13876 <div class="variablelist">
13877 <p class="title"><b></b></p>
13878 <dl class="variablelist">
13879 <dt><span class="term">Effects:</span></dt>
13880 <dd><p>
13881                     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>
13882                     with no associated task. If there was already a task associated
13883                     with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13884                     and that task has not been invoked, sets any futures associated
13885                     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
13886                     the result.
13887                   </p></dd>
13888 <dt><span class="term">Throws:</span></dt>
13889 <dd><p>
13890                     Nothing.
13891                   </p></dd>
13892 <dt><span class="term">Notes:</span></dt>
13893 <dd><p>
13894                     If the compiler does not support rvalue-references, this is implemented
13895                     using the boost.thread move emulation.
13896                   </p></dd>
13897 </dl>
13898 </div>
13899 </div>
13900 <div class="section">
13901 <div class="titlepage"><div><div><h6 class="title">
13902 <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>
13903 </h6></div></div></div>
13904 <pre class="programlisting"><span class="special">~</span><span class="identifier">packaged_task</span><span class="special">();</span>
13905 </pre>
13906 <div class="variablelist">
13907 <p class="title"><b></b></p>
13908 <dl class="variablelist">
13909 <dt><span class="term">Effects:</span></dt>
13910 <dd><p>
13911                     Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13912                     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
13913                     invoked, sets any futures associated with that task to <span class="emphasis"><em>ready</em></span>
13914                     with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code>
13915                     exception as the result.
13916                   </p></dd>
13917 <dt><span class="term">Throws:</span></dt>
13918 <dd><p>
13919                     Nothing.
13920                   </p></dd>
13921 </dl>
13922 </div>
13923 </div>
13924 <div class="section">
13925 <div class="titlepage"><div><div><h6 class="title">
13926 <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
13927             Function <code class="computeroutput"><span class="identifier">get_future</span><span class="special">()</span></code></a>
13928 </h6></div></div></div>
13929 <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">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
13930 </pre>
13931 <div class="variablelist">
13932 <p class="title"><b></b></p>
13933 <dl class="variablelist">
13934 <dt><span class="term">Effects:</span></dt>
13935 <dd><p>
13936                     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
13937                     the result of the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
13938                   </p></dd>
13939 <dt><span class="term">Throws:</span></dt>
13940 <dd><p>
13941                     <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
13942                     the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
13943                     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
13944                     the future associated with the task has already been retrieved.
13945                   </p></dd>
13946 </dl>
13947 </div>
13948 </div>
13949 <div class="section">
13950 <div class="titlepage"><div><div><h6 class="title">
13951 <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
13952             Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code></a>
13953 </h6></div></div></div>
13954 <pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()();</span>
13955 </pre>
13956 <div class="variablelist">
13957 <p class="title"><b></b></p>
13958 <dl class="variablelist">
13959 <dt><span class="term">Effects:</span></dt>
13960 <dd><p>
13961                     Invoke the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and store the result in the
13962                     corresponding future. If the task returns normally, the return
13963                     value is stored as the shared state, otherwise the exception
13964                     thrown is stored. Any threads blocked waiting for the shared
13965                     state associated with this task are woken.
13966                   </p></dd>
13967 <dt><span class="term">Postconditions:</span></dt>
13968 <dd><p>
13969                     All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
13970                   </p></dd>
13971 <dt><span class="term">Throws:</span></dt>
13972 <dd>
13973 <p>
13974                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
13975                     the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
13976                     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>.
13977                   </p>
13978 <p>
13979                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span></code> if the
13980                     task has already been invoked.
13981                   </p>
13982 </dd>
13983 </dl>
13984 </div>
13985 </div>
13986 <div class="section">
13987 <div class="titlepage"><div><div><h6 class="title">
13988 <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
13989             Function <code class="computeroutput"><span class="identifier">make_ready_at_thread_exit</span><span class="special">()</span></code></a>
13990 </h6></div></div></div>
13991 <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>
13992 </pre>
13993 <div class="variablelist">
13994 <p class="title"><b></b></p>
13995 <dl class="variablelist">
13996 <dt><span class="term">Effects:</span></dt>
13997 <dd><p>
13998                     Invoke the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and store the result in the
13999                     corresponding future. If the task returns normally, the return
14000                     value is stored as the shared state, otherwise the exception
14001                     thrown is stored. In either case, this is done without making
14002                     that state ready immediately. Schedules the shared state to be
14003                     made ready when the current thread exits, after all objects of
14004                     thread storage duration associated with the current thread have
14005                     been destroyed.
14006                   </p></dd>
14007 <dt><span class="term">Throws:</span></dt>
14008 <dd>
14009 <p>
14010                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
14011                     the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
14012                     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>.
14013                   </p>
14014 <p>
14015                     - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span></code> if the
14016                     task has already been invoked.
14017                   </p>
14018 </dd>
14019 </dl>
14020 </div>
14021 </div>
14022 <div class="section">
14023 <div class="titlepage"><div><div><h6 class="title">
14024 <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
14025             Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a>
14026 </h6></div></div></div>
14027 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
14028 </pre>
14029 <div class="variablelist">
14030 <p class="title"><b></b></p>
14031 <dl class="variablelist">
14032 <dt><span class="term">Effects:</span></dt>
14033 <dd><p>
14034                     Reset the state of the packaged_task so that it can be called
14035                     again.
14036                   </p></dd>
14037 <dt><span class="term">Throws:</span></dt>
14038 <dd><p>
14039                     <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
14040                     the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
14041                     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>.
14042                   </p></dd>
14043 </dl>
14044 </div>
14045 </div>
14046 <div class="section">
14047 <div class="titlepage"><div><div><h6 class="title">
14048 <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
14049             Function <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> EXTENSION</a>
14050 </h6></div></div></div>
14051 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
14052 <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>
14053 </pre>
14054 <div class="variablelist">
14055 <p class="title"><b></b></p>
14056 <dl class="variablelist">
14057 <dt><span class="term">Preconditions:</span></dt>
14058 <dd><p>
14059                     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>
14060                     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
14061                     be well-formed. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code>
14062                     shall have the same effect as invoking <code class="computeroutput"><span class="identifier">f</span></code>
14063                   </p></dd>
14064 <dt><span class="term">Effects:</span></dt>
14065 <dd><p>
14066                     Store a copy of <code class="computeroutput"><span class="identifier">f</span></code>
14067                     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>.
14068                     This will replace any existing wait callback store alongside
14069                     that task. If a thread subsequently calls one of the wait functions
14070                     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
14071                     with this task, and the result of the task is not <span class="emphasis"><em>ready</em></span>,
14072                     <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>
14073                     shall be invoked.
14074                   </p></dd>
14075 <dt><span class="term">Throws:</span></dt>
14076 <dd><p>
14077                     <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
14078                     the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
14079                     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>.
14080                   </p></dd>
14081 </dl>
14082 </div>
14083 </div>
14084 </div>
14085 <div class="section">
14086 <div class="titlepage"><div><div><h5 class="title">
14087 <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
14088           function <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code></a>
14089 </h5></div></div></div>
14090 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
14091 <span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">v</span><span class="special">)</span>
14092 <span class="special">{</span>
14093   <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">);</span>
14094 <span class="special">}</span>
14095 </pre>
14096 </div>
14097 <div class="section">
14098 <div class="titlepage"><div><div><h5 class="title">
14099 <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
14100           function <code class="computeroutput"><span class="identifier">async</span><span class="special">()</span></code></a>
14101 </h5></div></div></div>
14102 <p>
14103             The function template async provides a mechanism to launch a function
14104             potentially in a new thread and provides the result of the function in
14105             a future object with which it shares a shared state.
14106           </p>
14107 <h6>
14108 <a name="thread.synchronization.futures.reference.async.h0"></a>
14109             <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
14110             variant</a>
14111           </h6>
14112 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
14113    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">()&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
14114   <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
14115 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
14116    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">()&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
14117   <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">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
14118 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
14119    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">...)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
14120   <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&amp;</span><span class="identifier">ex</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
14121 </pre>
14122 <div class="variablelist">
14123 <p class="title"><b></b></p>
14124 <dl class="variablelist">
14125 <dt><span class="term">Requires:</span></dt>
14126 <dd>
14127 <p>
14128 </p>
14129 <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">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span>
14130 </pre>
14131 <p>
14132                 </p>
14133 <p>
14134                   shall be a valid expression.
14135                 </p>
14136 </dd>
14137 <dt><span class="term">Effects</span></dt>
14138 <dd>
14139 <p>
14140                   The first function behaves the same as a call to the second function
14141                   with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
14142                   <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
14143                   and the same arguments for <code class="computeroutput"><span class="identifier">F</span></code>.
14144                 </p>
14145 <p>
14146                   The second and third functions create a shared state that is associated
14147                   with the returned future object.
14148                 </p>
14149 <p>
14150                   The further behavior of the second function depends on the policy
14151                   argument as follows (if more than one of these conditions applies,
14152                   the implementation may choose any of the corresponding policies):
14153                 </p>
14154 <p>
14155                   - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&amp;</span>
14156                   <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">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code>
14157                   as if in a new thread of execution represented by a thread object
14158                   with the calls to <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code> being evaluated in the thread
14159                   that called <code class="computeroutput"><span class="identifier">async</span></code>.
14160                   Any return value is stored as the result in the shared state. Any
14161                   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">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code> is stored as the exceptional
14162                   result in the shared state. The thread object is stored in the
14163                   shared state and affects the behavior of any asynchronous return
14164                   objects that reference that state.
14165                 </p>
14166 <p>
14167                   - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&amp;</span>
14168                   <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> is non-zero - Stores
14169                   <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">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))</span></code>
14170                   in the shared state. This copy of <code class="computeroutput"><span class="identifier">f</span></code>
14171                   constitute a deferred function. Invocation of the deferred function
14172                   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>
14173                   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">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))</span></code>. The shared state is not made
14174                   ready until the function has completed. The first call to a non-timed
14175                   waiting function on an asynchronous return object referring to
14176                   this shared state shall invoke the deferred function in the thread
14177                   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>
14178                   begins, the function is no longer considered deferred. (Note: If
14179                   this policy is specified together with other policies, such as
14180                   when using a policy value of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
14181                   <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>,
14182                   implementations should defer invocation or the selection of the
14183                   policy when no more concurrency can be effectively exploited.)
14184                 </p>
14185 <p>
14186                   - if no valid launch policy is provided the behavior is undefined.
14187                 </p>
14188 <p>
14189                   The further behavior of the third function is as follows:
14190                 </p>
14191 <p>
14192                   - The Executor::submit() function is given a function&lt;void ()&gt;
14193                   which calls `INVOKE (DECAY_COPY (std::forward&lt;F&gt;(f)), DECAY_COPY
14194                   (std::forward&lt;Args&gt;(args))...). The implementation of the
14195                   executor is decided by the programmer.
14196                 </p>
14197 </dd>
14198 <dt><span class="term">Returns:</span></dt>
14199 <dd><p>
14200                   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">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span>
14201                   <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">()&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span></code>
14202                   that refers to the shared state created by this call to <code class="computeroutput"><span class="identifier">async</span></code>.
14203                 </p></dd>
14204 <dt><span class="term">Synchronization:</span></dt>
14205 <dd>
14206 <p>
14207                   Regardless of the provided policy argument,
14208                 </p>
14209 <p>
14210                   - the invocation of <code class="computeroutput"><span class="identifier">async</span></code>
14211                   synchronizes with the invocation of <code class="computeroutput"><span class="identifier">f</span></code>.
14212                   (Note: This statement applies even when the corresponding future
14213                   object is moved to another thread.); and
14214                 </p>
14215 <p>
14216                   - the completion of the function <code class="computeroutput"><span class="identifier">f</span></code>
14217                   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,
14218                   so its completion might never happen.)
14219                 </p>
14220 <p>
14221                   If the implementation chooses the <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14222                   policy,
14223                 </p>
14224 <p>
14225                   - a call to a non-timed waiting function on an asynchronous return
14226                   object that shares the shared state created by this async call
14227                   shall block until the associated thread has completed, as if joined,
14228                   or else time out;
14229                 </p>
14230 <p>
14231                   - the associated thread completion synchronizes with the return
14232                   from the first function that successfully detects the ready status
14233                   of the shared state or with the return from the last function that
14234                   releases the shared state, whichever happens first.
14235                 </p>
14236 </dd>
14237 <dt><span class="term">Throws:</span></dt>
14238 <dd><p>
14239                   <code class="computeroutput"><span class="identifier">system_error</span></code> if
14240                   policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14241                   and the implementation is unable to start a new thread.
14242                 </p></dd>
14243 <dt><span class="term">Error conditions:</span></dt>
14244 <dd><p>
14245                   - <code class="computeroutput"><span class="identifier">resource_unavailable_try_again</span></code>
14246                   - if policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14247                   and the system is unable to start a new thread.
14248                 </p></dd>
14249 <dt><span class="term">Remarks::</span></dt>
14250 <dd><p>
14251                   The first signature shall not participate in overload resolution
14252                   if <code class="computeroutput"><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;</span>
14253                   <span class="identifier">is</span> </code>boost:: launch<code class="computeroutput">
14254                   <span class="keyword">or</span> </code>boost::is_executor&lt;F&gt;<code class="computeroutput">
14255                   <span class="identifier">is</span> </code>true_type`.
14256                 </p></dd>
14257 </dl>
14258 </div>
14259 <h6>
14260 <a name="thread.synchronization.futures.reference.async.h1"></a>
14261             <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
14262             variant</a>
14263           </h6>
14264 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
14265    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">...)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
14266   <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
14267 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
14268    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">...)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
14269   <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">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
14270 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
14271    <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">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">...)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span>
14272   <span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span> <span class="special">&amp;</span><span class="identifier">ex</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span><span class="special">);</span>
14273 </pre>
14274 <div class="warning"><table border="0" summary="Warning">
14275 <tr>
14276 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
14277 <th align="left">Warning</th>
14278 </tr>
14279 <tr><td align="left" valign="top"><p>
14280               the variadic prototype is provided only on C++11 compilers supporting
14281               rvalue references, variadic templates, decltype and a standard library
14282               providing &lt;tuple&gt; (waiting for a boost::tuple that is move aware),
14283               and BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK is defined.
14284             </p></td></tr>
14285 </table></div>
14286 <div class="variablelist">
14287 <p class="title"><b></b></p>
14288 <dl class="variablelist">
14289 <dt><span class="term">Requires:</span></dt>
14290 <dd>
14291 <p>
14292                   <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>
14293                   shall satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
14294                   requirements.
14295                 </p>
14296 <p>
14297                   invoke (decay_copy (boost::forward&lt;F&gt;(f)), decay_copy (boost::forward&lt;Args&gt;(args))...)
14298                 </p>
14299 <p>
14300                   shall be a valid expression.
14301                 </p>
14302 </dd>
14303 <dt><span class="term">Effects:</span></dt>
14304 <dd>
14305 <p>
14306                   - The first function behaves the same as a call to the second function
14307                   with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
14308                   <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
14309                   and the same arguments for <code class="computeroutput"><span class="identifier">F</span></code>
14310                   and <code class="computeroutput"><span class="identifier">Args</span></code>.
14311                 </p>
14312 <p>
14313                   - The second function creates a shared state that is associated
14314                   with the returned future object. The further behavior of the second
14315                   function depends on the policy argument as follows (if more than
14316                   one of these conditions applies, the implementation may choose
14317                   any of the corresponding policies):
14318                 </p>
14319 <p>
14320                   - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&amp;</span>
14321                   <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">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)),</span>
14322                   <span class="identifier">decay_copy</span> <span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...)</span></code>
14323                   as if in a new thread of execution represented by a thread object
14324                   with the calls to <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code> being evaluated in the thread
14325                   that called <code class="computeroutput"><span class="identifier">async</span></code>.
14326                   Any return value is stored as the result in the shared state. Any
14327                   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">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)),</span> <span class="identifier">decay_copy</span>
14328                   <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...)</span></code> is stored as the exceptional
14329                   result in the shared state. The thread object is stored in the
14330                   shared state and affects the behavior of any asynchronous return
14331                   objects that reference that state.
14332                 </p>
14333 <p>
14334                   - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&amp;</span>
14335                   <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> is non-zero - Stores
14336                   <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))</span></code>
14337                   and <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...</span></code> in the shared state. These
14338                   copies of <code class="computeroutput"><span class="identifier">f</span></code> and
14339                   <code class="computeroutput"><span class="identifier">args</span></code> constitute
14340                   a deferred function. Invocation of the deferred function evaluates
14341                   <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>
14342                   <span class="identifier">move</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">))</span></code>
14343                   where <code class="computeroutput"><span class="identifier">g</span></code> is the
14344                   stored value of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))</span></code> and <code class="computeroutput"><span class="identifier">xyz</span></code>
14345                   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">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...</span></code>. The shared state is not made
14346                   ready until the function has completed. The first call to a non-timed
14347                   waiting function on an asynchronous return object referring to
14348                   this shared state shall invoke the deferred function in the thread
14349                   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>
14350                   <span class="identifier">move</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">))</span></code>
14351                   begins, the function is no longer considered deferred.
14352                 </p>
14353 <p>
14354                   - if no valid launch policy is provided the behaviour is undefined.
14355                 </p>
14356 </dd>
14357 <dt><span class="term">Note:</span></dt>
14358 <dd><p>
14359                   If this policy is specified together with other policies, such
14360                   as when using a policy value of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
14361                   <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>,
14362                   implementations should defer invocation or the selection of the
14363                   policy when no more concurrency can be effectively exploited.
14364                 </p></dd>
14365 <dt><span class="term">Returns:</span></dt>
14366 <dd><p>
14367                   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">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span>
14368                   <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">(</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">...)&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span></code> that refers to the shared state
14369                   created by this call to <code class="computeroutput"><span class="identifier">async</span></code>.
14370                 </p></dd>
14371 <dt><span class="term">Synchronization:</span></dt>
14372 <dd>
14373 <p>
14374                   Regardless of the provided policy argument,
14375                 </p>
14376 <p>
14377                   - the invocation of async synchronizes with the invocation of
14378                   <code class="computeroutput"><span class="identifier">f</span></code>. (Note: This
14379                   statement applies even when the corresponding future object is
14380                   moved to another thread.); and
14381                 </p>
14382 <p>
14383                   - the completion of the function <code class="computeroutput"><span class="identifier">f</span></code>
14384                   is sequenced before the shared state is made ready. (Note: f might
14385                   not be called at all, so its completion might never happen.)
14386                 </p>
14387 <p>
14388                   If the implementation chooses the <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14389                   policy,
14390                 </p>
14391 <p>
14392                   - a call to a waiting function on an asynchronous return object
14393                   that shares the shared state created by this async call shall block
14394                   until the associated thread has completed, as if joined, or else
14395                   time out;
14396                 </p>
14397 <p>
14398                   - the associated thread completion synchronizes with the return
14399                   from the first function that successfully detects the ready status
14400                   of the shared state or with the return from the last function that
14401                   releases the shared state, whichever happens first.
14402                 </p>
14403 </dd>
14404 <dt><span class="term">Throws:</span></dt>
14405 <dd><p>
14406                   <code class="computeroutput"><span class="identifier">system_error</span></code> if
14407                   policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14408                   and the implementation is unable to start a new thread.
14409                 </p></dd>
14410 <dt><span class="term">Error conditions:</span></dt>
14411 <dd><p>
14412                   - <code class="computeroutput"><span class="identifier">resource_unavailable_try_again</span></code>
14413                   - if policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14414                   and the system is unable to start a new thread.
14415                 </p></dd>
14416 <dt><span class="term">Remarks:</span></dt>
14417 <dd><p>
14418                   The first signature shall not participate in overload resolution
14419                   if decay&lt;F&gt;::type is boost::launch.
14420                 </p></dd>
14421 </dl>
14422 </div>
14423 </div>
14424 <div class="section">
14425 <div class="titlepage"><div><div><h5 class="title">
14426 <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
14427           function <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
14428           - EXTENSION</a>
14429 </h5></div></div></div>
14430 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
14431   <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>
14432
14433 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
14434   <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&amp;</span> <span class="identifier">f2</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14435
14436 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
14437   <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&amp;</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&amp;</span> <span class="identifier">f3</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14438
14439 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
14440   <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&amp;</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&amp;</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&amp;</span> <span class="identifier">f4</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14441
14442 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
14443   <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&amp;</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&amp;</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&amp;</span> <span class="identifier">f4</span><span class="special">,</span><span class="identifier">F5</span><span class="special">&amp;</span> <span class="identifier">f5</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14444 </pre>
14445 <div class="variablelist">
14446 <p class="title"><b></b></p>
14447 <dl class="variablelist">
14448 <dt><span class="term">Preconditions:</span></dt>
14449 <dd><p>
14450                   The types <code class="computeroutput"><span class="identifier">Fn</span></code> shall
14451                   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
14452                   with a <code class="computeroutput"><span class="identifier">value_type</span></code>
14453                   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>.
14454                 </p></dd>
14455 <dt><span class="term">Effects:</span></dt>
14456 <dd><p>
14457                   Waits until at least one of the specified futures is <span class="emphasis"><em>ready</em></span>.
14458                 </p></dd>
14459 <dt><span class="term">Returns:</span></dt>
14460 <dd><p>
14461                   The range-based overload returns an <code class="computeroutput"><span class="identifier">Iterator</span></code>
14462                   identifying the first future in the range that was detected as
14463                   <span class="emphasis"><em>ready</em></span>. The remaining overloads return the
14464                   zero-based index of the first future that was detected as <span class="emphasis"><em>ready</em></span>
14465                   (first parameter =&gt; 0, second parameter =&gt; 1, etc.).
14466                 </p></dd>
14467 <dt><span class="term">Throws:</span></dt>
14468 <dd><p>
14469                   <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current
14470                   thread is interrupted. Any exception thrown by the <span class="emphasis"><em>wait
14471                   callback</em></span> associated with any of the futures being waited
14472                   for. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory could not
14473                   be allocated for the internal wait structures.
14474                 </p></dd>
14475 <dt><span class="term">Notes:</span></dt>
14476 <dd><p>
14477                   <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
14478                   is an <span class="emphasis"><em>interruption point</em></span>.
14479                 </p></dd>
14480 </dl>
14481 </div>
14482 </div>
14483 <div class="section">
14484 <div class="titlepage"><div><div><h5 class="title">
14485 <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
14486           function <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
14487           - EXTENSION</a>
14488 </h5></div></div></div>
14489 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
14490   <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>
14491
14492 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
14493   <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&amp;</span> <span class="identifier">f2</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14494
14495 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
14496   <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&amp;</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&amp;</span> <span class="identifier">f3</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14497
14498 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
14499   <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&amp;</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&amp;</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&amp;</span> <span class="identifier">f4</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14500
14501 <span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
14502   <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&amp;</span> <span class="identifier">f1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">&amp;</span> <span class="identifier">f2</span><span class="special">,</span><span class="identifier">F3</span><span class="special">&amp;</span> <span class="identifier">f3</span><span class="special">,</span><span class="identifier">F4</span><span class="special">&amp;</span> <span class="identifier">f4</span><span class="special">,</span><span class="identifier">F5</span><span class="special">&amp;</span> <span class="identifier">f5</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14503 </pre>
14504 <div class="variablelist">
14505 <p class="title"><b></b></p>
14506 <dl class="variablelist">
14507 <dt><span class="term">Preconditions:</span></dt>
14508 <dd><p>
14509                   The types <code class="computeroutput"><span class="identifier">Fn</span></code> shall
14510                   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
14511                   with a <code class="computeroutput"><span class="identifier">value_type</span></code>
14512                   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>.
14513                 </p></dd>
14514 <dt><span class="term">Effects:</span></dt>
14515 <dd><p>
14516                   Waits until all of the specified futures are <span class="emphasis"><em>ready</em></span>.
14517                 </p></dd>
14518 <dt><span class="term">Throws:</span></dt>
14519 <dd><p>
14520                   Any exceptions thrown by a call to <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> on the specified futures.
14521                 </p></dd>
14522 <dt><span class="term">Notes:</span></dt>
14523 <dd><p>
14524                   <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
14525                   is an <span class="emphasis"><em>interruption point</em></span>.
14526                 </p></dd>
14527 </dl>
14528 </div>
14529 </div>
14530 <div class="section">
14531 <div class="titlepage"><div><div><h5 class="title">
14532 <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
14533           function <code class="computeroutput"><span class="identifier">when_all</span><span class="special">()</span></code>
14534           - EXTENSION</a>
14535 </h5></div></div></div>
14536 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
14537   <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</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">&gt;&gt;</span>
14538   <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>
14539
14540 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FutTypes</span><span class="special">&gt;</span>
14541   <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">FutTypes</span><span class="special">&gt;...&gt;</span> <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">FutTypes</span><span class="special">&amp;&amp;...</span> <span class="identifier">futures</span><span class="special">);</span>
14542 </pre>
14543 <div class="variablelist">
14544 <p class="title"><b></b></p>
14545 <dl class="variablelist">
14546 <dt><span class="term">Requires:</span></dt>
14547 <dd><p>
14548                   - For the first overload, <code class="computeroutput"><span class="identifier">InputIterator</span></code>'s
14549                   value type shall be convertible to <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. All <code class="computeroutput"><span class="identifier">R</span></code>
14550                   types must be the same. If any of the <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code> objects are in invalid state
14551                   (i.e. <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
14552                   <span class="special">==</span> <span class="keyword">false</span></code>),
14553                   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">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>
14554                   or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</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>
14555                   or a <code class="computeroutput"><span class="identifier">shared_future</span></code>
14556                   object for which <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
14557                   <span class="keyword">false</span></code> is undefined.
14558                 </p></dd>
14559 <dt><span class="term">Notes:</span></dt>
14560 <dd>
14561 <p>
14562                   - There are two variations of <code class="computeroutput"><span class="identifier">when_all</span></code>.
14563                   The first version takes a pair of <code class="computeroutput"><span class="identifier">InputIterators</span></code>.
14564                   The second takes any arbitrary number of <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R0</span><span class="special">&gt;</span></code> and <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R1</span><span class="special">&gt;</span></code> objects, where <code class="computeroutput"><span class="identifier">R0</span></code> and <code class="computeroutput"><span class="identifier">R1</span></code>
14565                   need not be the same type.
14566                 </p>
14567 <p>
14568                   - Calling the first signature of <code class="computeroutput"><span class="identifier">when_all</span></code>
14569                   where <code class="computeroutput"><span class="identifier">InputIterator</span></code>
14570                   first equals last, returns a future with an empty <code class="computeroutput"><span class="identifier">vector</span></code> that is immediately ready.
14571                 </p>
14572 <p>
14573                   - Calling the second signature of <code class="computeroutput"><span class="identifier">when_all</span></code>
14574                   with no arguments returns a future&lt;tuple&lt;&gt;&gt; that is
14575                   immediately ready.
14576                 </p>
14577 </dd>
14578 <dt><span class="term">Effects:</span></dt>
14579 <dd>
14580 <p>
14581                   - If any of the futures supplied to a call to <code class="computeroutput"><span class="identifier">when_all</span></code>
14582                   refer to deferred tasks that have not started execution, those
14583                   tasks are executed before the call to <code class="computeroutput"><span class="identifier">when_all</span></code>
14584                   returns. Once all such tasks have been executed, the call to <code class="computeroutput"><span class="identifier">when_all</span></code> returns immediately.
14585                 </p>
14586 <p>
14587                   - The call to <code class="computeroutput"><span class="identifier">when_all</span></code>
14588                   does not wait for non-deferred tasks, or deferred tasks that have
14589                   already started executing elsewhere, to complete before returning.
14590                 </p>
14591 <p>
14592                   - 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
14593                   call to <code class="computeroutput"><span class="identifier">when_all</span></code>
14594                   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
14595                   into the associated state of the future returned from the call
14596                   to <code class="computeroutput"><span class="identifier">when_all</span></code>, preserving
14597                   the order of the futures supplied to <code class="computeroutput"><span class="identifier">when_all</span></code>.
14598                 </p>
14599 <p>
14600                   - The collection is then stored as the result in a newly created
14601                   shared state.
14602                 </p>
14603 <p>
14604                   - A new future object that refers to the shared state is created.
14605                   The exact type of the future is further described below.
14606                 </p>
14607 <p>
14608                   - The <code class="computeroutput"><span class="identifier">future</span></code> returned
14609                   by <code class="computeroutput"><span class="identifier">when_all</span></code> will
14610                   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
14611                   output collection may.
14612                 </p>
14613 </dd>
14614 <dt><span class="term">Returns:</span></dt>
14615 <dd>
14616 <p>
14617                   - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">tuple</span><span class="special">&lt;&gt;&gt;</span></code>
14618                   if <code class="computeroutput"><span class="identifier">when_all</span></code> is
14619                   called with zero arguments.
14620                 </p>
14621 <p>
14622                   - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;&gt;&gt;</span></code>
14623                   if the input cardinality is unknown at compile and the iterator
14624                   pair yields <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. The order of the futures in
14625                   the output vector will be the same as given by the input iterator.
14626                 </p>
14627 <p>
14628                   - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;&gt;&gt;</span></code>
14629                   if the input cardinality is unknown at compile time and the iterator
14630                   pair yields <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. The order of the futures in
14631                   the output vector will be the same as given by the input iterator.
14632                 </p>
14633 <p>
14634                   - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">FutTypes</span><span class="special">&gt;...&gt;&gt;</span></code>
14635                   if inputs are fixed in number.
14636                 </p>
14637 </dd>
14638 <dt><span class="term">Postconditions:</span></dt>
14639 <dd>
14640 <p>
14641                   - All input futures valid() == false.
14642                 </p>
14643 <p>
14644                   - All input shared future valid() == true.
14645                 </p>
14646 <p>
14647                   - valid() == true.
14648                 </p>
14649 </dd>
14650 </dl>
14651 </div>
14652 </div>
14653 <div class="section">
14654 <div class="titlepage"><div><div><h5 class="title">
14655 <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
14656           function <code class="computeroutput"><span class="identifier">when_any</span><span class="special">()</span></code>
14657           - EXTENSION</a>
14658 </h5></div></div></div>
14659 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
14660   <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</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">&gt;&gt;</span>
14661   <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>
14662
14663 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FutTypes</span><span class="special">&gt;</span>
14664   <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">FutTypes</span><span class="special">&gt;...&gt;</span>
14665   <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">FutTypes</span><span class="special">&amp;&amp;...</span> <span class="identifier">futures</span><span class="special">);</span>
14666 </pre>
14667 <div class="variablelist">
14668 <p class="title"><b></b></p>
14669 <dl class="variablelist">
14670 <dt><span class="term">Requires:</span></dt>
14671 <dd><p>
14672                   - For the first overload, <code class="computeroutput"><span class="identifier">InputIterator</span></code>'s
14673                   value type shall be convertible to <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. All <code class="computeroutput"><span class="identifier">R</span></code>
14674                   types must be the same. If any of the <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code> or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code> objects are in invalid state
14675                   (i.e. <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
14676                   <span class="special">==</span> <span class="keyword">false</span></code>),
14677                   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">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>
14678                   or <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</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>
14679                   or a <code class="computeroutput"><span class="identifier">shared_future</span></code>
14680                   object for which <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
14681                   <span class="keyword">false</span> <span class="identifier">is</span>
14682                   <span class="identifier">undefined</span></code>.
14683                 </p></dd>
14684 <dt><span class="term">Notes:</span></dt>
14685 <dd>
14686 <p>
14687                   - There are two variations of <code class="computeroutput"><span class="identifier">when_any</span>
14688                   </code>. The first version takes a pair of <code class="computeroutput"><span class="identifier">InputIterators</span></code>.
14689                   The second takes any arbitrary number of <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R0</span><span class="special">&gt;</span></code> and <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R1</span><span class="special">&gt;</span></code> objects, where <code class="computeroutput"><span class="identifier">R0</span></code> and <code class="computeroutput"><span class="identifier">R1</span></code>
14690                   need not be the same type.
14691                 </p>
14692 <p>
14693                   - Calling the first signature of <code class="computeroutput"><span class="identifier">when_any</span>
14694                   </code> where <code class="computeroutput"><span class="identifier">InputIterator</span></code>
14695                   first equals last, returns a future with an empty <code class="computeroutput"><span class="identifier">vector</span></code> that is immediately ready.
14696                 </p>
14697 <p>
14698                   - Calling the second signature of <code class="computeroutput"><span class="identifier">when_any</span></code>
14699                   with no arguments returns a future&lt;tuple&lt;&gt;&gt; that is
14700                   immediately ready.
14701                 </p>
14702 </dd>
14703 <dt><span class="term">Effects:</span></dt>
14704 <dd>
14705 <p>
14706                   - Each of the futures supplied to <code class="computeroutput"><span class="identifier">when_any</span></code>
14707                   is checked in the order supplied. If a given future is ready, then
14708                   no further futures are checked, and the call to <code class="computeroutput"><span class="identifier">when_any</span></code>
14709                   returns immediately. If a given future refers to a deferred task
14710                   that has not yet started execution, then no further futures are
14711                   checked, that task is executed, and the call to <code class="computeroutput"><span class="identifier">when_any</span></code>
14712                   then returns immediately.
14713                 </p>
14714 <p>
14715                   - The call to <code class="computeroutput"><span class="identifier">when_any</span></code>
14716                   does not wait for non-deferred tasks, or deferred tasks that have
14717                   already started executing elsewhere, to complete before returning.
14718                 </p>
14719 <p>
14720                   - 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
14721                   are moved into the associated state of the future returned from
14722                   the call to <code class="computeroutput"><span class="identifier">when_any</span></code>,
14723                   preserving the order of the futures supplied to <code class="computeroutput"><span class="identifier">when_any</span></code>.
14724                   That future is then ready.
14725                 </p>
14726 <p>
14727                   - The collection is then stored as the result in a newly created
14728                   shared state.
14729                 </p>
14730 <p>
14731                   - A new future object that refers to the shared state is created.
14732                   The exact type of the future is further described below.
14733                 </p>
14734 <p>
14735                   - The future returned by <code class="computeroutput"><span class="identifier">when_any</span></code>
14736                   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
14737                   output collection may.
14738                 </p>
14739 </dd>
14740 <dt><span class="term">Returns:</span></dt>
14741 <dd>
14742 <p>
14743                   - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">tuple</span><span class="special">&lt;&gt;&gt;</span></code>
14744                   if <code class="computeroutput"><span class="identifier">when_any</span> </code> is
14745                   called with zero arguments.
14746                 </p>
14747 <p>
14748                   - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;&gt;&gt;</span></code>
14749                   if the input cardinality is unknown at compile and the iterator
14750                   pair yields <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. The order of the futures in
14751                   the output vector will be the same as given by the input iterator.
14752                 </p>
14753 <p>
14754                   - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;&gt;&gt;</span></code>
14755                   if the input cardinality is unknown at compile time and the iterator
14756                   pair yields <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. The order of the futures in
14757                   the output vector will be the same as given by the input iterator.
14758                 </p>
14759 <p>
14760                   - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">decat_t</span><span class="special">&lt;</span><span class="identifier">FutTypes</span><span class="special">&gt;...&gt;&gt;</span></code>
14761                   if inputs are fixed in number.
14762                 </p>
14763 </dd>
14764 <dt><span class="term">Postconditions:</span></dt>
14765 <dd>
14766 <p>
14767                   - All input futures valid() == false.
14768                 </p>
14769 <p>
14770                   - All input shared_futures valid() == true.
14771                 </p>
14772 <p>
14773                   - valid() == true.
14774                 </p>
14775 </dd>
14776 </dl>
14777 </div>
14778 </div>
14779 <div class="section">
14780 <div class="titlepage"><div><div><h5 class="title">
14781 <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
14782           function <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> EXTENSION</a>
14783 </h5></div></div></div>
14784 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
14785   <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span> <span class="identifier">make_ready_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
14786 <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">make_ready_future</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
14787 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
14788   <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
14789 <span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
14790   <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</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>
14791 </pre>
14792 <div class="variablelist">
14793 <p class="title"><b></b></p>
14794 <dl class="variablelist">
14795 <dt><span class="term">Effects:</span></dt>
14796 <dd>
14797 <p>
14798                   - value prototype: The value that is passed into the function is
14799                   moved to the shared state of the returned function if it is an
14800                   rvalue. Otherwise the value is copied to the shared state of the
14801                   returned function.
14802                 </p>
14803 <p>
14804                   - exception: The exception that is passed into the function is
14805                   copied to the shared state of the returned function.
14806                 </p>
14807 <p>
14808                   .
14809                 </p>
14810 </dd>
14811 <dt><span class="term">Returns:</span></dt>
14812 <dd>
14813 <p>
14814                   - a ready future with the value set with <code class="computeroutput"><span class="identifier">value</span></code>
14815                 </p>
14816 <p>
14817                   - a ready future with the exception set with <code class="computeroutput"><span class="identifier">ex</span></code>
14818                 </p>
14819 <p>
14820                   - a ready future&lt;void&gt; with the value set (void).
14821                 </p>
14822 </dd>
14823 <dt><span class="term">Postcondition:</span></dt>
14824 <dd>
14825 <p>
14826                   - Returned future, valid() == true
14827                 </p>
14828 <p>
14829                   - Returned future, is_ready() = true
14830                 </p>
14831 <p>
14832                   - Returned future, has_value() = true or has_exception() depending
14833                   on the prototype.
14834                 </p>
14835 </dd>
14836 </dl>
14837 </div>
14838 </div>
14839 <div class="section">
14840 <div class="titlepage"><div><div><h5 class="title">
14841 <a name="thread.synchronization.futures.reference.make_exceptional"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_exceptional" title="Non-member function make_exceptional() EXTENSION">Non-member
14842           function <code class="computeroutput"><span class="identifier">make_exceptional</span><span class="special">()</span></code> EXTENSION</a>
14843 </h5></div></div></div>
14844 <pre class="programlisting"><span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</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>
14845 <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
14846   <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
14847 <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
14848 </pre>
14849 <div class="variablelist">
14850 <p class="title"><b></b></p>
14851 <dl class="variablelist">
14852 <dt><span class="term">Effects:</span></dt>
14853 <dd><p>
14854                   The exception that is passed in to the function or the current
14855                   exception if no parameter is given is moved into the returned
14856                   <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>
14857                   if it is an rvalue. Otherwise the exception is copied into the
14858                   returned <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>.
14859                 </p></dd>
14860 <dt><span class="term">Returns:</span></dt>
14861 <dd><p>
14862                   An exceptional_ptr instance implicitly convertible to a future&lt;T&gt;
14863                 </p></dd>
14864 </dl>
14865 </div>
14866 </div>
14867 <div class="section">
14868 <div class="titlepage"><div><div><h5 class="title">
14869 <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
14870           function <code class="computeroutput"><span class="identifier">make_future</span><span class="special">()</span></code>
14871           DEPRECATED</a>
14872 </h5></div></div></div>
14873 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
14874   <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span> <span class="identifier">make_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">);</span>  <span class="comment">// DEPRECATED</span>
14875 <span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">make_future</span><span class="special">();</span>  <span class="comment">// DEPRECATED</span>
14876 </pre>
14877 <div class="variablelist">
14878 <p class="title"><b></b></p>
14879 <dl class="variablelist">
14880 <dt><span class="term">Effects:</span></dt>
14881 <dd><p>
14882                   The value that is passed into the function is moved to the shared
14883                   state of the returned function if it is an rvalue. Otherwise the
14884                   value is copied to the shared state of the returned function. .
14885                 </p></dd>
14886 <dt><span class="term">Returns:</span></dt>
14887 <dd>
14888 <p>
14889                   - future&lt;T&gt;, if function is given a value of type T
14890                 </p>
14891 <p>
14892                   - future&lt;void&gt;, if the function is not given any inputs.
14893                 </p>
14894 </dd>
14895 <dt><span class="term">Postcondition:</span></dt>
14896 <dd>
14897 <p>
14898                   - Returned future&lt;T&gt;, valid() == true
14899                 </p>
14900 <p>
14901                   - Returned future&lt;T&gt;, is_ready() = true
14902                 </p>
14903 </dd>
14904 <dt><span class="term">See:</span></dt>
14905 <dd><p>
14906                   <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code>
14907                 </p></dd>
14908 </dl>
14909 </div>
14910 </div>
14911 <div class="section">
14912 <div class="titlepage"><div><div><h5 class="title">
14913 <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
14914           function <code class="computeroutput"><span class="identifier">make_shared_future</span><span class="special">()</span></code> DEPRECATED</a>
14915 </h5></div></div></div>
14916 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
14917   <span class="identifier">shared_future</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">decay</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;</span> <span class="identifier">make_shared_future</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;</span> <span class="identifier">value</span><span class="special">);</span>  <span class="comment">// DEPRECATED</span>
14918 <span class="identifier">shared_future</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">make_shared_future</span><span class="special">();</span>  <span class="comment">// DEPRECATED</span>
14919 </pre>
14920 <div class="variablelist">
14921 <p class="title"><b></b></p>
14922 <dl class="variablelist">
14923 <dt><span class="term">Effects:</span></dt>
14924 <dd><p>
14925                   The value that is passed in to the function is moved to the shared
14926                   state of the returned function if it is an rvalue. Otherwise the
14927                   value is copied to the shared state of the returned function. .
14928                 </p></dd>
14929 <dt><span class="term">Returns:</span></dt>
14930 <dd>
14931 <p>
14932                   - shared_future&lt;T&gt;, if function is given a value of type
14933                   T
14934                 </p>
14935 <p>
14936                   - shared_future&lt;void&gt;, if the function is not given any inputs.
14937                 </p>
14938 </dd>
14939 <dt><span class="term">Postcondition:</span></dt>
14940 <dd>
14941 <p>
14942                   - Returned shared_future&lt;T&gt;, valid() == true
14943                 </p>
14944 <p>
14945                   - Returned shared_future&lt;T&gt;, is_ready() = true
14946                 </p>
14947 </dd>
14948 <dt><span class="term">See:</span></dt>
14949 <dd><p>
14950                   <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">&lt;&gt;::</span><span class="identifier">share</span><span class="special">()</span></code>
14951                 </p></dd>
14952 </dl>
14953 </div>
14954 </div>
14955 </div>
14956 </div>
14957 </div>
14958 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
14959 <td align="left"></td>
14960 <td align="right"><div class="copyright-footer">Copyright &#169; 2007 -11 Anthony Williams<br>Copyright &#169; 2011 -14 Vicente J. Botet Escriba<p>
14961         Distributed under the Boost Software License, Version 1.0. (See accompanying
14962         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>)
14963       </p>
14964 </div></td>
14965 </tr></table>
14966 <hr>
14967 <div class="spirit-nav">
14968 <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>
14969 </div>
14970 </body>
14971 </html>