• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5<title>Synchronization</title>
6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
9<link rel="up" href="../thread.html" title="Chapter 39. Thread 4.8.0">
10<link rel="prev" href="ScopedThreads.html" title="Scoped Threads">
11<link rel="next" href="thread_local_storage.html" title="Thread Local Storage">
12</head>
13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14<table cellpadding="2" width="100%"><tr>
15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16<td align="center"><a href="../../../index.html">Home</a></td>
17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20<td align="center"><a href="../../../more/index.htm">More</a></td>
21</tr></table>
22<hr>
23<div class="spirit-nav">
24<a accesskey="p" href="ScopedThreads.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="thread_local_storage.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
25</div>
26<div class="section">
27<div class="titlepage"><div><div><h2 class="title" style="clear: both">
28<a name="thread.synchronization"></a><a class="link" href="synchronization.html" title="Synchronization">Synchronization</a>
29</h2></div></div></div>
30<div class="toc"><dl class="toc">
31<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial">Tutorial</a></span></dt>
32<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts">Mutex Concepts</a></span></dt>
33<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_option">Lock Options</a></span></dt>
34<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard">Lock Guard</a></span></dt>
35<dt><span class="section"><a href="synchronization.html#thread.synchronization.with_lock_guard">With Lock Guard</a></span></dt>
36<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts">Lock Concepts</a></span></dt>
37<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks">Lock Types</a></span></dt>
38<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks">Other Lock Types
39      - EXTENSION</a></span></dt>
40<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions">Lock functions</a></span></dt>
41<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories">Lock Factories
42      - EXTENSION</a></span></dt>
43<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types">Mutex Types</a></span></dt>
44<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref">Condition Variables</a></span></dt>
45<dt><span class="section"><a href="synchronization.html#thread.synchronization.once">One-time Initialization</a></span></dt>
46<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers">Barriers -- EXTENSION</a></span></dt>
47<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches">Latches -- EXPERIMENTAL</a></span></dt>
48<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors">Executors and Schedulers
49      -- EXPERIMENTAL</a></span></dt>
50<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures">Futures</a></span></dt>
51</dl></div>
52<div class="section">
53<div class="titlepage"><div><div><h3 class="title">
54<a name="thread.synchronization.tutorial"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial" title="Tutorial">Tutorial</a>
55</h3></div></div></div>
56<div class="toc"><dl class="toc">
57<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking">Internal
58        Locking</a></span></dt>
59<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes">External
60        Locking -- <code class="computeroutput"><span class="identifier">strict_lock</span></code> and
61        <code class="computeroutput"><span class="identifier">externally_locked</span></code> classes</a></span></dt>
62<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.with">Executing Around
63        a Function</a></span></dt>
64</dl></div>
65<p>
66        <a href="http://web.archive.org/web/20140531071228/http://home.roadrunner.com/~hinnant/mutexes/locking.html" target="_top">Handling
67        mutexes in C++</a> is an excellent tutorial. You need just replace std
68        and ting by boost.
69      </p>
70<p>
71        <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html" target="_top">Mutex,
72        Lock, Condition Variable Rationale</a> adds rationale for the design
73        decisions made for mutexes, locks and condition variables.
74      </p>
75<p>
76        In addition to the C++11 standard locks, Boost.Thread provides other locks
77        and some utilities that help the user to make their code thread-safe.
78      </p>
79<div class="section">
80<div class="titlepage"><div><div><h4 class="title">
81<a name="thread.synchronization.tutorial.internal_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking" title="Internal Locking">Internal
82        Locking</a>
83</h4></div></div></div>
84<div class="toc"><dl class="toc">
85<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution">Concurrent
86          threads of execution</a></span></dt>
87<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_locking">Internal
88          locking</a></span></dt>
89<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_and_external_locking">Internal
90          and external locking</a></span></dt>
91</dl></div>
92<div class="note"><table border="0" summary="Note">
93<tr>
94<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
95<th align="left">Note</th>
96</tr>
97<tr><td align="left" valign="top"><p>
98            This tutorial is an adaptation of chapter Concurrency of the Object-Oriented
99            Programming in the BETA Programming Language and of the paper of Andrei
100            Alexandrescu "Multithreading and the C++ Type System" to the
101            Boost library.
102          </p></td></tr>
103</table></div>
104<div class="section">
105<div class="titlepage"><div><div><h5 class="title">
106<a name="thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.concurrent_threads_of_execution" title="Concurrent threads of execution">Concurrent
107          threads of execution</a>
108</h5></div></div></div>
109<p>
110            Consider, for example, modeling a bank account class that supports simultaneous
111            deposits and withdrawals from multiple locations (arguably the "Hello,
112            World" of multithreaded programming).
113          </p>
114<p>
115            From here a component is a model of the <code class="computeroutput"><span class="identifier">Callable</span></code>
116            concept.
117          </p>
118<p>
119            I C++11 (Boost) concurrent execution of a component is obtained by means
120            of the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">thread</span></code>(<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code>):
121          </p>
122<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread1</span><span class="special">(</span><span class="identifier">S</span><span class="special">);</span>
123</pre>
124<p>
125            where <code class="computeroutput"><span class="identifier">S</span></code> is a model of
126            <code class="computeroutput"><span class="identifier">Callable</span></code>. The meaning
127            of this expression is that execution of <code class="computeroutput"><span class="identifier">S</span><span class="special">()</span></code> will take place concurrently with the
128            current thread of execution executing the expression.
129          </p>
130<p>
131            The following example includes a bank account of a person (Joe) and two
132            components, one corresponding to a bank agent depositing money in Joe's
133            account, and one representing Joe. Joe will only be withdrawing money
134            from the account:
135          </p>
136<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span><span class="special">;</span>
137
138<span class="identifier">BankAccount</span> <span class="identifier">JoesAccount</span><span class="special">;</span>
139
140<span class="keyword">void</span> <span class="identifier">bankAgent</span><span class="special">()</span>
141<span class="special">{</span>
142    <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span><span class="number">10</span><span class="special">;</span> <span class="identifier">i</span><span class="special">&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>
143        <span class="comment">//...</span>
144        <span class="identifier">JoesAccount</span><span class="special">.</span><span class="identifier">Deposit</span><span class="special">(</span><span class="number">500</span><span class="special">);</span>
145        <span class="comment">//...</span>
146    <span class="special">}</span>
147<span class="special">}</span>
148
149<span class="keyword">void</span> <span class="identifier">Joe</span><span class="special">()</span> <span class="special">{</span>
150    <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span><span class="number">10</span><span class="special">;</span> <span class="identifier">i</span><span class="special">&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>
151        <span class="comment">//...</span>
152        <span class="keyword">int</span> <span class="identifier">myPocket</span> <span class="special">=</span> <span class="identifier">JoesAccount</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">100</span><span class="special">);</span>
153        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&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>
154        <span class="comment">//...</span>
155    <span class="special">}</span>
156<span class="special">}</span>
157
158<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
159    <span class="comment">//...</span>
160    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread1</span><span class="special">(</span><span class="identifier">bankAgent</span><span class="special">);</span> <span class="comment">// start concurrent execution of bankAgent</span>
161    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">thread2</span><span class="special">(</span><span class="identifier">Joe</span><span class="special">);</span> <span class="comment">// start concurrent execution of Joe</span>
162    <span class="identifier">thread1</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
163    <span class="identifier">thread2</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
164    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
165<span class="special">}</span>
166</pre>
167<p>
168            From time to time, the <code class="computeroutput"><span class="identifier">bankAgent</span></code>
169            will deposit $500 in <code class="computeroutput"><span class="identifier">JoesAccount</span></code>.
170            <code class="computeroutput"><span class="identifier">Joe</span></code> will similarly withdraw
171            $100 from his account. These sentences describe that the <code class="computeroutput"><span class="identifier">bankAgent</span></code> and <code class="computeroutput"><span class="identifier">Joe</span></code>
172            are executed concurrently.
173          </p>
174</div>
175<div class="section">
176<div class="titlepage"><div><div><h5 class="title">
177<a name="thread.synchronization.tutorial.internal_locking.internal_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_locking" title="Internal locking">Internal
178          locking</a>
179</h5></div></div></div>
180<p>
181            The above example works well as long as the components <code class="computeroutput"><span class="identifier">bankAgent</span></code> and <code class="computeroutput"><span class="identifier">Joe</span></code>
182            doesn't access <code class="computeroutput"><span class="identifier">JoesAccount</span></code>
183            at the same time. There is, however, no guarantee that this will not
184            happen. We may use a mutex to guarantee exclusive access to each bank.
185          </p>
186<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
187    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span>
188    <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
189<span class="keyword">public</span><span class="special">:</span>
190    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
191        <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
192        <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
193        <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
194    <span class="special">}</span>
195    <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
196        <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
197        <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
198        <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
199    <span class="special">}</span>
200    <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
201        <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
202        <span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">balance_</span><span class="special">;</span>
203        <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
204        <span class="keyword">return</span> <span class="identifier">b</span><span class="special">;</span>
205    <span class="special">}</span>
206<span class="special">};</span>
207</pre>
208<p>
209            Execution of the <code class="computeroutput"><span class="identifier">Deposit</span></code>
210            and <code class="computeroutput"><span class="identifier">Withdraw</span></code> operations
211            will no longer be able to make simultaneous access to balance.
212          </p>
213<p>
214            A mutex is a simple and basic mechanism for obtaining synchronization.
215            In the above example it is relatively easy to be convinced that the synchronization
216            works correctly (in the absence of exception). In a system with several
217            concurrent objects and several shared objects, it may be difficult to
218            describe synchronization by means of mutexes. Programs that make heavy
219            use of mutexes may be difficult to read and write. Instead, we shall
220            introduce a number of generic classes for handling more complicated forms
221            of synchronization and communication.
222          </p>
223<p>
224            With the RAII idiom we can simplify a lot this using the scoped locks.
225            In the code below, guard's constructor locks the passed-in object <code class="computeroutput"><span class="identifier">mtx_</span></code>, and guard's destructor unlocks
226            <code class="computeroutput"><span class="identifier">mtx_</span></code>.
227          </p>
228<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
229    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span> <span class="comment">// explicit mutex declaration </span>
230    <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
231<span class="keyword">public</span><span class="special">:</span>
232    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
233        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
234        <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
235    <span class="special">}</span>
236    <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
237        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
238        <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
239    <span class="special">}</span>
240    <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
241        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
242        <span class="keyword">return</span> <span class="identifier">balance_</span><span class="special">;</span>
243    <span class="special">}</span>
244<span class="special">};</span>
245</pre>
246<p>
247            The object-level locking idiom doesn't cover the entire richness of a
248            threading model. For example, the model above is quite deadlock-prone
249            when you try to coordinate multi-object transactions. Nonetheless, object-level
250            locking is useful in many cases, and in combination with other mechanisms
251            can provide a satisfactory solution to many threaded access problems
252            in object-oriented programs.
253          </p>
254</div>
255<div class="section">
256<div class="titlepage"><div><div><h5 class="title">
257<a name="thread.synchronization.tutorial.internal_locking.internal_and_external_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.internal_locking.internal_and_external_locking" title="Internal and external locking">Internal
258          and external locking</a>
259</h5></div></div></div>
260<p>
261            The BankAccount class above uses internal locking. Basically, a class
262            that uses internal locking guarantees that any concurrent calls to its
263            public member functions don't corrupt an instance of that class. This
264            is typically ensured by having each public member function acquire a
265            lock on the object upon entry. This way, for any given object of that
266            class, there can be only one member function call active at any moment,
267            so the operations are nicely serialized.
268          </p>
269<p>
270            This approach is reasonably easy to implement and has an attractive simplicity.
271            Unfortunately, "simple" might sometimes morph into "simplistic."
272          </p>
273<p>
274            Internal locking is insufficient for many real-world synchronization
275            tasks. Imagine that you want to implement an ATM withdrawal transaction
276            with the BankAccount class. The requirements are simple. The ATM transaction
277            consists of two withdrawals-one for the actual money and one for the
278            $2 commission. The two withdrawals must appear in strict sequence; that
279            is, no other transaction can exist between them.
280          </p>
281<p>
282            The obvious implementation is erratic:
283          </p>
284<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&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>
285    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span>
286    <span class="comment">// preemption possible</span>
287    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
288<span class="special">}</span>
289</pre>
290<p>
291            The problem is that between the two calls above, another thread can perform
292            another operation on the account, thus breaking the second design requirement.
293          </p>
294<p>
295            In an attempt to solve this problem, let's lock the account from the
296            outside during the two operations:
297          </p>
298<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&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>
299    <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>
300    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span>
301    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
302<span class="special">}</span>
303</pre>
304<p>
305            Notice that the code above doesn't compile, the <code class="computeroutput"><span class="identifier">mtx_</span></code>
306            field is private. We have two possibilities:
307          </p>
308<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
309<li class="listitem">
310                make <code class="computeroutput"><span class="identifier">mtx_</span></code> public
311                which seems odd
312              </li>
313<li class="listitem">
314                make the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
315                lockable by adding the lock/unlock functions
316              </li>
317</ul></div>
318<p>
319            We can add these functions explicitly
320          </p>
321<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
322    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mtx_</span><span class="special">;</span>
323    <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
324<span class="keyword">public</span><span class="special">:</span>
325    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
326        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
327        <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
328    <span class="special">}</span>
329    <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
330        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
331        <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
332    <span class="special">}</span>
333    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">()</span> <span class="special">{</span>
334        <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
335    <span class="special">}</span>
336    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">()</span> <span class="special">{</span>
337        <span class="identifier">mtx_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
338    <span class="special">}</span>
339<span class="special">};</span>
340</pre>
341<p>
342            or inheriting from a class which add these lockable functions.
343          </p>
344<p>
345            The <code class="computeroutput"><span class="identifier">basic_lockable_adapter</span></code>
346            class helps to define the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
347            class as
348          </p>
349<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
350<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;</span>
351<span class="special">{</span>
352    <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
353<span class="keyword">public</span><span class="special">:</span>
354    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
355        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
356        <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
357    <span class="special">}</span>
358    <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
359        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
360        <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
361    <span class="special">}</span>
362    <span class="keyword">int</span> <span class="identifier">GetBalance</span><span class="special">()</span> <span class="special">{</span>
363        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
364        <span class="keyword">return</span> <span class="identifier">balance_</span><span class="special">;</span>
365    <span class="special">}</span>
366<span class="special">};</span>
367</pre>
368<p>
369            and the code that doesn't compiles becomes
370          </p>
371<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&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>
372    <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>
373    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">);</span>
374    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
375<span class="special">}</span>
376</pre>
377<p>
378            Notice that now acct is being locked by Withdraw after it has already
379            been locked by guard. When running such code, one of two things happens.
380          </p>
381<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
382<li class="listitem">
383                Your mutex implementation might support the so-called recursive mutex
384                semantics. This means that the same thread can lock the same mutex
385                several times successfully. In this case, the implementation works
386                but has a performance overhead due to unnecessary locking. (The locking/unlocking
387                sequence in the two Withdraw calls is not needed but performed anyway-and
388                that costs time.)
389              </li>
390<li class="listitem">
391                Your mutex implementation might not support recursive locking, which
392                means that as soon as you try to acquire it the second time, it blocks-so
393                the ATMWithdrawal function enters the dreaded deadlock.
394              </li>
395</ul></div>
396<p>
397            As <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code> is not recursive, we need to
398            use its recursive version <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code>.
399          </p>
400<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
401<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">recursive_mutex</span><span class="special">&gt;</span>
402<span class="special">{</span>
403
404    <span class="comment">// ...</span>
405<span class="special">};</span>
406</pre>
407<p>
408            The caller-ensured locking approach is more flexible and the most efficient,
409            but very dangerous. In an implementation using caller-ensured locking,
410            BankAccount still holds a mutex, but its member functions don't manipulate
411            it at all. Deposit and Withdraw are not thread-safe anymore. Instead,
412            the client code is responsible for locking BankAccount properly.
413          </p>
414<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
415    <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&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>
416    <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
417<span class="keyword">public</span><span class="special">:</span>
418    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
419        <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
420    <span class="special">}</span>
421    <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
422        <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
423    <span class="special">}</span>
424<span class="special">};</span>
425</pre>
426<p>
427            Obviously, the caller-ensured locking approach has a safety problem.
428            BankAccount's implementation code is finite, and easy to reach and maintain,
429            but there's an unbounded amount of client code that manipulates BankAccount
430            objects. In designing applications, it's important to differentiate between
431            requirements imposed on bounded code and unbounded code. If your class
432            makes undue requirements on unbounded code, that's usually a sign that
433            encapsulation is out the window.
434          </p>
435<p>
436            To conclude, if in designing a multi-threaded class you settle on internal
437            locking, you expose yourself to inefficiency or deadlocks. On the other
438            hand, if you rely on caller-provided locking, you make your class error-prone
439            and difficult to use. Finally, external locking completely avoids the
440            issue by leaving it all to the client code.
441          </p>
442</div>
443</div>
444<div class="section">
445<div class="titlepage"><div><div><h4 class="title">
446<a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes" title="External Locking -- strict_lock and externally_locked classes">External
447        Locking -- <code class="computeroutput"><span class="identifier">strict_lock</span></code> and
448        <code class="computeroutput"><span class="identifier">externally_locked</span></code> classes</a>
449</h4></div></div></div>
450<div class="toc"><dl class="toc">
451<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits">Locks
452          as permits</a></span></dt>
453<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking">Improving
454          External Locking</a></span></dt>
455<dt><span class="section"><a href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks">Allowing
456          other strict locks</a></span></dt>
457</dl></div>
458<div class="note"><table border="0" summary="Note">
459<tr>
460<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
461<th align="left">Note</th>
462</tr>
463<tr><td align="left" valign="top"><p>
464            This tutorial is an adaptation of the paper by Andrei Alexandrescu "Multithreading
465            and the C++ Type System" to the Boost library.
466          </p></td></tr>
467</table></div>
468<div class="section">
469<div class="titlepage"><div><div><h5 class="title">
470<a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.locks_as_permits" title="Locks as permits">Locks
471          as permits</a>
472</h5></div></div></div>
473<p>
474            So what to do? Ideally, the BankAccount class should do the following:
475          </p>
476<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
477<li class="listitem">
478                Support both locking models (internal and external).
479              </li>
480<li class="listitem">
481                Be efficient; that is, use no unnecessary locking.
482              </li>
483<li class="listitem">
484                Be safe; that is, BankAccount objects cannot be manipulated without
485                appropriate locking.
486              </li>
487</ul></div>
488<p>
489            Let's make a worthwhile observation: Whenever you lock a BankAccount,
490            you do so by using a <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code> object. Turning this statement around,
491            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
492            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>
493            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
494            (it's not a transmissible permit).
495          </p>
496<div class="orderedlist"><ol class="orderedlist" type="1">
497<li class="listitem">
498                As long as a permit is still alive, the <code class="computeroutput"><span class="identifier">BankAccount</span></code>
499                object stays locked.
500              </li>
501<li class="listitem">
502                When the <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&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.
503              </li>
504</ol></div>
505<p>
506            The net effect is that at any point in your code, having access to a
507            <code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
508            object guarantees that a <code class="computeroutput"><span class="identifier">BankAccount</span></code>
509            is locked. (You don't know exactly which <code class="computeroutput"><span class="identifier">BankAccount</span></code>
510            is locked, however-an issue that we'll address soon.)
511          </p>
512<p>
513            For now, let's make a couple of enhancements to the <code class="computeroutput"><span class="identifier">lock_guard</span></code>
514            class template defined in Boost.Thread. We'll call the enhanced version
515            <code class="computeroutput"><span class="identifier">strict_lock</span></code>. Essentially,
516            a <code class="computeroutput"><span class="identifier">strict_lock</span></code>'s role
517            is only to live on the stack as an automatic variable. <code class="computeroutput"><span class="identifier">strict_lock</span></code> must adhere to a non-copy
518            and non-alias policy. <code class="computeroutput"><span class="identifier">strict_lock</span></code>
519            disables copying by making the copy constructor and the assignment operator
520            private.
521          </p>
522<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
523<span class="keyword">class</span> <span class="identifier">strict_lock</span>  <span class="special">{</span>
524<span class="keyword">public</span><span class="special">:</span>
525    <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">lockable_type</span><span class="special">;</span>
526
527
528    <span class="keyword">explicit</span> <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">lockable_type</span><span class="special">&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>
529        <span class="identifier">obj</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> <span class="comment">// locks on construction</span>
530    <span class="special">}</span>
531    <span class="identifier">strict_lock</span><span class="special">()</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
532    <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
533    <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>
534
535    <span class="special">~</span><span class="identifier">strict_lock</span><span class="special">()</span> <span class="special">{</span> <span class="identifier">obj_</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span> <span class="special">}</span> <span class="comment">//  unlocks on destruction </span>
536
537    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="comment">// strict lockers specific function </span>
538    <span class="special">{</span>
539      <span class="keyword">return</span> <span class="identifier">l</span> <span class="special">==</span> <span class="special">&amp;</span><span class="identifier">obj_</span><span class="special">;</span>
540    <span class="special">}</span>
541<span class="keyword">private</span><span class="special">:</span>
542    <span class="identifier">lockable_type</span><span class="special">&amp;</span> <span class="identifier">obj_</span><span class="special">;</span>
543<span class="special">};</span>
544</pre>
545<p>
546            Silence can be sometimes louder than words-what's forbidden to do with
547            a <code class="computeroutput"><span class="identifier">strict_lock</span></code> is as important
548            as what you can do. Let's see what you can and what you cannot do with
549            a <code class="computeroutput"><span class="identifier">strict_lock</span></code> instantiation:
550          </p>
551<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
552                You can create a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code> only starting from a valid T
553                object. Notice that there is no other way you can create a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>.
554              </li></ul></div>
555<pre class="programlisting"><span class="identifier">BankAccount</span> <span class="identifier">myAccount</span><span class="special">(</span><span class="string">"John Doe"</span><span class="special">,</span> <span class="string">"123-45-6789"</span><span class="special">);</span>
556<span class="identifier">strict_lock</span><span class="special">&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>
557</pre>
558<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
559                You cannot copy <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
560                to one another. In particular, you cannot pass <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
561                by value to functions or have them returned by functions:
562              </li></ul></div>
563<pre class="programlisting"><span class="keyword">extern</span> <span class="identifier">strict_lock</span><span class="special">&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>
564<span class="keyword">extern</span> <span class="keyword">void</span> <span class="identifier">Bar</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;);</span> <span class="comment">// compile-time error</span>
565</pre>
566<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
567                However, you still can pass <code class="computeroutput"><span class="identifier">strict_lock</span></code>s
568                by reference to and from functions:
569              </li></ul></div>
570<pre class="programlisting"><span class="comment">// ok, Foo returns a reference to strict_lock&lt;BankAccount&gt;</span>
571<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>
572<span class="comment">// ok, Bar takes a reference to strict_lock&lt;BankAccount&gt;</span>
573<span class="keyword">extern</span> <span class="keyword">void</span> <span class="identifier">Bar</span><span class="special">(</span><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;);</span>
574</pre>
575<p>
576            All these rules were put in place with one purpose-enforcing that owning
577            a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
578            is a reasonably strong guarantee that
579          </p>
580<div class="orderedlist"><ol class="orderedlist" type="1">
581<li class="listitem">
582                you locked a T object, and
583              </li>
584<li class="listitem">
585                that object will be unlocked at a later point.
586              </li>
587</ol></div>
588<p>
589            Now that we have such a strict <code class="computeroutput"><span class="identifier">strict_lock</span></code>,
590            how do we harness its power in defining a safe, flexible interface for
591            BankAccount? The idea is as follows:
592          </p>
593<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
594<li class="listitem">
595                Each of BankAccount's interface functions (in our case, Deposit and
596                Withdraw) comes in two overloaded variants.
597              </li>
598<li class="listitem">
599                One version keeps the same signature as before, and the other takes
600                an additional argument of type <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>. The first version is internally
601                locked; the second one requires external locking. External locking
602                is enforced at compile time by requiring client code to create a
603                <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
604                object.
605              </li>
606<li class="listitem">
607                BankAccount avoids code bloating by having the internal locked functions
608                forward to the external locked functions, which do the actual job.
609              </li>
610</ul></div>
611<p>
612            A little code is worth 1,000 words, a (hacked into) saying goes, so here's
613            the new BankAccount class:
614          </p>
615<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span>
616<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span>
617<span class="special">{</span>
618    <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
619<span class="keyword">public</span><span class="special">:</span>
620    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span> <span class="special">{</span>
621        <span class="comment">// Externally locked</span>
622        <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
623    <span class="special">}</span>
624    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
625        <span class="identifier">strict_lock</span><span class="special">&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> <span class="comment">// Internally locked</span>
626        <span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
627    <span class="special">}</span>
628    <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span> <span class="special">{</span>
629        <span class="comment">// Externally locked</span>
630        <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
631    <span class="special">}</span>
632    <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
633        <span class="identifier">strict_lock</span><span class="special">&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> <span class="comment">// Internally locked</span>
634        <span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
635    <span class="special">}</span>
636<span class="special">};</span>
637</pre>
638<p>
639            Now, if you want the benefit of internal locking, you simply call <code class="computeroutput"><span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code> and
640            <code class="computeroutput"><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>.
641            If you want to use external locking, you lock the object by constructing
642            a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
643            and then you call <code class="computeroutput"><span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span>
644            <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span></code>
645            and <code class="computeroutput"><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span></code>.
646            For example, here's the <code class="computeroutput"><span class="identifier">ATMWithdrawal</span></code>
647            function implemented correctly:
648          </p>
649<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&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>
650    <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>
651    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
652    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
653<span class="special">}</span>
654</pre>
655<p>
656            This function has the best of both worlds-it's reasonably safe and efficient
657            at the same time.
658          </p>
659<p>
660            It's worth noting that <code class="computeroutput"><span class="identifier">strict_lock</span></code>
661            being a template gives extra safety compared to a straight polymorphic
662            approach. In such a design, BankAccount would derive from a Lockable
663            interface. <code class="computeroutput"><span class="identifier">strict_lock</span></code>
664            would manipulate Lockable references so there's no need for templates.
665            This approach is sound; however, it provides fewer compile-time guarantees.
666            Having a <code class="computeroutput"><span class="identifier">strict_lock</span></code>
667            object would only tell that some object derived from Lockable is currently
668            locked. In the templated approach, having a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code> gives a stronger guarantee-it's a
669            <code class="computeroutput"><span class="identifier">BankAccount</span></code> that stays
670            locked.
671          </p>
672<p>
673            There's a weasel word in there-I mentioned that ATMWithdrawal is reasonably
674            safe. It's not really safe because there's no enforcement that the <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;</span></code>
675            object locks the appropriate BankAccount object. The type system only
676            ensures that some BankAccount object is locked. For example, consider
677            the following phony implementation of ATMWithdrawal:
678          </p>
679<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ATMWithdrawal</span><span class="special">(</span><span class="identifier">BankAccount</span><span class="special">&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>
680    <span class="identifier">BankAccount</span> <span class="identifier">fakeAcct</span><span class="special">(</span><span class="string">"John Doe"</span><span class="special">,</span> <span class="string">"123-45-6789"</span><span class="special">);</span>
681    <span class="identifier">strict_lock</span><span class="special">&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>
682    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">sum</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
683    <span class="identifier">acct</span><span class="special">.</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="identifier">guard</span><span class="special">);</span>
684<span class="special">}</span>
685</pre>
686<p>
687            This code compiles warning-free but obviously doesn't do the right thing-it
688            locks one account and uses another.
689          </p>
690<p>
691            It's important to understand what can be enforced within the realm of
692            the C++ type system and what needs to be enforced at runtime. The mechanism
693            we've put in place so far ensures that some BankAccount object is locked
694            during the call to <code class="computeroutput"><span class="identifier">BankAccount</span><span class="special">::</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span>
695            <span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">&gt;&amp;)</span></code>.
696            We must enforce at runtime exactly what object is locked.
697          </p>
698<p>
699            If our scheme still needs runtime checks, how is it useful? An unwary
700            or malicious programmer can easily lock the wrong object and manipulate
701            any BankAccount without actually locking it.
702          </p>
703<p>
704            First, let's get the malice issue out of the way. C is a language that
705            requires a lot of attention and discipline from the programmer. C++ made
706            some progress by asking a little less of those, while still fundamentally
707            trusting the programmer. These languages are not concerned with malice
708            (as Java is, for example). After all, you can break any C/C++ design
709            simply by using casts "appropriately" (if appropriately is
710            an, er, appropriate word in this context).
711          </p>
712<p>
713            The scheme is useful because the likelihood of a programmer forgetting
714            about any locking whatsoever is much greater than the likelihood of a
715            programmer who does remember about locking, but locks the wrong object.
716          </p>
717<p>
718            Using <code class="computeroutput"><span class="identifier">strict_lock</span></code> permits
719            compile-time checking of the most common source of errors, and runtime
720            checking of the less frequent problem.
721          </p>
722<p>
723            Let's see how to enforce that the appropriate BankAccount object is locked.
724            First, we need to add a member function to the <code class="computeroutput"><span class="identifier">strict_lock</span></code>
725            class template. The <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">strict_lock</span><span class="special">&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">Lockable</span><span class="special">*)</span></code>
726            function returns a reference to the locked object.
727          </p>
728<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
729    <span class="special">...</span> <span class="identifier">as</span> <span class="identifier">before</span> <span class="special">...</span>
730<span class="keyword">public</span><span class="special">:</span>
731    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mtx</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">mtx</span><span class="special">==&amp;</span><span class="identifier">obj_</span><span class="special">;</span> <span class="special">}</span>
732<span class="special">};</span>
733</pre>
734<p>
735            Second, BankAccount needs to use this function compare the locked object
736            against this:
737          </p>
738<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
739<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span>
740    <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
741<span class="keyword">public</span><span class="special">:</span>
742    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">,</span> <span class="identifier">strict_lock</span><span class="special">&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>
743        <span class="comment">// Externally locked</span>
744        <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">guard</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span>
745            <span class="keyword">throw</span> <span class="string">"Locking Error: Wrong Object Locked"</span><span class="special">;</span>
746        <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
747    <span class="special">}</span>
748<span class="comment">// ...</span>
749<span class="special">};</span>
750</pre>
751<p>
752            The overhead incurred by the test above is much lower than locking a
753            recursive mutex for the second time.
754          </p>
755</div>
756<div class="section">
757<div class="titlepage"><div><div><h5 class="title">
758<a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.improving_external_locking" title="Improving External Locking">Improving
759          External Locking</a>
760</h5></div></div></div>
761<p>
762            Now let's assume that BankAccount doesn't use its own locking at all,
763            and has only a thread-neutral implementation:
764          </p>
765<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">BankAccount</span> <span class="special">{</span>
766    <span class="keyword">int</span> <span class="identifier">balance_</span><span class="special">;</span>
767<span class="keyword">public</span><span class="special">:</span>
768    <span class="keyword">void</span> <span class="identifier">Deposit</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
769        <span class="identifier">balance_</span> <span class="special">+=</span> <span class="identifier">amount</span><span class="special">;</span>
770    <span class="special">}</span>
771    <span class="keyword">void</span> <span class="identifier">Withdraw</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
772        <span class="identifier">balance_</span> <span class="special">-=</span> <span class="identifier">amount</span><span class="special">;</span>
773    <span class="special">}</span>
774<span class="special">};</span>
775</pre>
776<p>
777            Now you can use BankAccount in single-threaded and multi-threaded applications
778            alike, but you need to provide your own synchronization in the latter
779            case.
780          </p>
781<p>
782            Say we have an AccountManager class that holds and manipulates a BankAccount
783            object:
784          </p>
785<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">AccountManager</span>
786<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span>
787<span class="special">{</span>
788    <span class="identifier">BankAccount</span> <span class="identifier">checkingAcct_</span><span class="special">;</span>
789    <span class="identifier">BankAccount</span> <span class="identifier">savingsAcct_</span><span class="special">;</span>
790    <span class="special">...</span>
791<span class="special">};</span>
792</pre>
793<p>
794            Let's also assume that, by design, AccountManager must stay locked while
795            accessing its BankAccount members. The question is, how can we express
796            this design constraint using the C++ type system? How can we state "You
797            have access to this BankAccount object only after locking its parent
798            AccountManager object"?
799          </p>
800<p>
801            The solution is to use a little bridge template <code class="computeroutput"><span class="identifier">externally_locked</span></code>
802            that controls access to a BankAccount.
803          </p>
804<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
805<span class="keyword">class</span> <span class="identifier">externally_locked</span> <span class="special">{</span>
806    <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">LockableConcept</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;));</span>
807
808<span class="keyword">public</span><span class="special">:</span>
809    <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">T</span><span class="special">&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>
810        <span class="special">:</span> <span class="identifier">obj_</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span>
811        <span class="special">,</span> <span class="identifier">lockable_</span><span class="special">(</span><span class="identifier">lockable</span><span class="special">)</span>
812    <span class="special">{}</span>
813
814    <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">lockable</span><span class="special">)</span>
815        <span class="special">:</span> <span class="identifier">obj_</span><span class="special">()</span>
816        <span class="special">,</span> <span class="identifier">lockable_</span><span class="special">(</span><span class="identifier">lockable</span><span class="special">)</span>
817    <span class="special">{}</span>
818
819    <span class="identifier">T</span><span class="special">&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>
820
821<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
822        <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(&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="comment">//run time check throw if not locks the same</span>
823<span class="preprocessor">#endif</span>
824        <span class="keyword">return</span> <span class="identifier">obj_</span><span class="special">;</span>
825    <span class="special">}</span>
826    <span class="keyword">void</span> <span class="identifier">set</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&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>
827        <span class="identifier">obj_</span> <span class="special">=</span> <span class="identifier">obj</span><span class="special">;</span>
828        <span class="identifier">lockable_</span><span class="special">=</span><span class="identifier">lockable</span><span class="special">;</span>
829    <span class="special">}</span>
830<span class="keyword">private</span><span class="special">:</span>
831    <span class="identifier">T</span> <span class="identifier">obj_</span><span class="special">;</span>
832    <span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">lockable_</span><span class="special">;</span>
833<span class="special">};</span>
834</pre>
835<p>
836            <code class="computeroutput"><span class="identifier">externally_locked</span></code> cloaks
837            an object of type T, and actually provides full access to that object
838            through the get and set member functions, provided you pass a reference
839            to a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">Owner</span><span class="special">&gt;</span></code>
840            object.
841          </p>
842<p>
843            Instead of making <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>
844            and <code class="computeroutput"><span class="identifier">savingsAcct_</span></code> of type
845            <code class="computeroutput"><span class="identifier">BankAccount</span></code>, <code class="computeroutput"><span class="identifier">AccountManager</span></code> holds objects of type
846            <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">BankAccount</span><span class="special">,</span>
847            <span class="identifier">AccountManager</span><span class="special">&gt;</span></code>:
848          </p>
849<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">AccountManager</span>
850    <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span>
851<span class="special">{</span>
852<span class="keyword">public</span><span class="special">:</span>
853    <span class="keyword">typedef</span> <span class="identifier">basic_lockable_adapter</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">lockable_base_type</span><span class="special">;</span>
854    <span class="identifier">AccountManager</span><span class="special">()</span>
855        <span class="special">:</span> <span class="identifier">checkingAcct_</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
856        <span class="special">,</span> <span class="identifier">savingsAcct_</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span>
857    <span class="special">{}</span>
858    <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">Checking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">);</span>
859    <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">);</span>
860<span class="keyword">private</span><span class="special">:</span>
861
862    <span class="identifier">externally_locked</span><span class="special">&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>
863    <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>
864<span class="special">};</span>
865</pre>
866<p>
867            The pattern is the same as before - to access the BankAccount object
868            cloaked by <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>,
869            you need to call <code class="computeroutput"><span class="identifier">get</span></code>.
870            To call <code class="computeroutput"><span class="identifier">get</span></code>, you need
871            to pass it a <code class="computeroutput"><span class="identifier">strict_lock</span><span class="special">&lt;</span><span class="identifier">AccountManager</span><span class="special">&gt;</span></code>. The one thing you have to take care
872            of is to not hold pointers or references you obtained by calling <code class="computeroutput"><span class="identifier">get</span></code>. If you do that, make sure that
873            you don't use them after the strict_lock has been destroyed. That is,
874            if you alias the cloaked objects, you're back from "the compiler
875            takes care of that" mode to "you must pay attention" mode.
876          </p>
877<p>
878            Typically, you use <code class="computeroutput"><span class="identifier">externally_locked</span></code>
879            as shown below. Suppose you want to execute an atomic transfer from your
880            checking account to your savings account:
881          </p>
882<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">Checking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
883    <span class="identifier">strict_lock</span><span class="special">&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>
884    <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
885    <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
886<span class="special">}</span>
887</pre>
888<p>
889            We achieved two important goals. First, the declaration of <code class="computeroutput"><span class="identifier">checkingAcct_</span></code> and <code class="computeroutput"><span class="identifier">savingsAcct_</span></code>
890            makes it clear to the code reader that that variable is protected by
891            a lock on an AccountManager. Second, the design makes it impossible to
892            manipulate the two accounts without actually locking a BankAccount.
893            <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
894            what could be called active documentation.
895          </p>
896</div>
897<div class="section">
898<div class="titlepage"><div><div><h5 class="title">
899<a name="thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.external_locking_____strict_lock__and__externally_locked__classes.allowing_other_strict_locks" title="Allowing other strict locks">Allowing
900          other strict locks</a>
901</h5></div></div></div>
902<p>
903            Now imagine that the AccountManager function needs to take a <code class="computeroutput"><span class="identifier">unique_lock</span></code> in order to reduce the
904            critical regions. And at some time it needs to access to the <code class="computeroutput"><span class="identifier">checkingAcct_</span></code>. As <code class="computeroutput"><span class="identifier">unique_lock</span></code>
905            is not a strict lock the following code doesn't compile:
906          </p>
907<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
908    <span class="identifier">unique_lock</span><span class="special">&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>
909    <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
910        <span class="identifier">guard</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
911    <span class="special">}</span>
912    <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span> <span class="comment">// COMPILE ERROR</span>
913    <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>  <span class="comment">// COMPILE ERROR</span>
914    <span class="identifier">do_something_else</span><span class="special">();</span>
915<span class="special">}</span>
916</pre>
917<p>
918            We need a way to transfer the ownership from the <code class="computeroutput"><span class="identifier">unique_lock</span></code>
919            to a <code class="computeroutput"><span class="identifier">strict_lock</span></code> during
920            the time we are working with <code class="computeroutput"><span class="identifier">savingsAcct_</span></code>
921            and then restore the ownership on <code class="computeroutput"><span class="identifier">unique_lock</span></code>.
922          </p>
923<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
924    <span class="identifier">unique_lock</span><span class="special">&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>
925    <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
926        <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
927    <span class="special">}</span>
928    <span class="special">{</span>
929        <span class="identifier">strict_lock</span><span class="special">&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>
930        <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
931        <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
932    <span class="special">}</span>
933    <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
934<span class="special">}</span>
935</pre>
936<p>
937            In order to make this code compilable we need to store either a Lockable
938            or a <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;</span></code>
939            reference depending on the constructor. We also need to store which kind
940            of reference we have stored, and in the destructor call either to the
941            Lockable <code class="computeroutput"><span class="identifier">unlock</span></code> or restore
942            the ownership.
943          </p>
944<p>
945            This seems too complicated to me. Another possibility is to define a
946            nested strict lock class. The drawback is that instead of having only
947            one strict lock we have two and we need either to duplicate every function
948            taking a <code class="computeroutput"><span class="identifier">strict_lock</span></code>
949            or make these function templates. The problem with template functions
950            is that we don't profit anymore of the C++ type system. We must add some
951            static metafunction that checks that the Locker parameter is a strict
952            lock. The problem is that we can not really check this or can we?. The
953            <code class="computeroutput"><span class="identifier">is_strict_lock</span></code> metafunction
954            must be specialized by the strict lock developer. We need to believe
955            it "sur parole". The advantage is that now we can manage with
956            more than two strict locks without changing our code. This is really
957            nice.
958          </p>
959<p>
960            Now we need to state that both classes are <code class="computeroutput"><span class="identifier">strict_lock</span></code>s.
961          </p>
962<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Locker</span><span class="special">&gt;</span>
963<span class="keyword">struct</span> <span class="identifier">is_strict_lock</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span> <span class="special">{};</span>
964
965<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
966<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>
967
968<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>
969<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>
970</pre>
971<p>
972            Well let me show what this <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>
973            class looks like and the impacts on the <code class="computeroutput"><span class="identifier">externally_locked</span></code>
974            class and the <code class="computeroutput"><span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedFunction</span></code>
975            function.
976          </p>
977<p>
978            First <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>
979            class will store on a temporary lock the <code class="computeroutput"><span class="identifier">Locker</span></code>,
980            and transfer the lock ownership on the constructor. On destruction it
981            will restore the ownership. Note the use of <code class="computeroutput"><span class="identifier">lock_traits</span></code>
982            and that the <code class="computeroutput"><span class="identifier">Locker</span></code> needs
983            to have a reference to the mutex otherwise an exception is thrown.
984          </p>
985<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Locker</span> <span class="special">&gt;</span>
986<span class="keyword">class</span> <span class="identifier">nested_strict_lock</span>
987    <span class="special">{</span>
988      <span class="identifier">BOOST_CONCEPT_ASSERT</span><span class="special">((</span><span class="identifier">MovableLockerConcept</span><span class="special">&lt;</span><span class="identifier">Locker</span><span class="special">&gt;));</span>
989<span class="keyword">public</span><span class="special">:</span>
990    <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">lockable_type</span><span class="special">&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>
991    <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>
992
993    <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>
994        <span class="special">:</span> <span class="identifier">lock_</span><span class="special">(</span><span class="identifier">lock</span><span class="special">)</span>  <span class="comment">// Store reference to locker</span>
995        <span class="special">,</span> <span class="identifier">tmp_lock_</span><span class="special">(</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">move</span><span class="special">())</span> <span class="comment">// Move ownership to temporary locker </span>
996    <span class="special">{</span>
997        <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
998        <span class="keyword">if</span> <span class="special">(</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()==</span><span class="number">0</span><span class="special">)</span> <span class="special">{</span>
999            <span class="identifier">lock_</span><span class="special">=</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">move</span><span class="special">();</span> <span class="comment">// Rollback for coherency purposes </span>
1000            <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span>
1001        <span class="special">}</span>
1002        <span class="preprocessor">#endif</span>
1003        <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">tmp_lock_</span><span class="special">)</span> <span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span> <span class="comment">// ensures it is locked </span>
1004    <span class="special">}</span>
1005    <span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="special">{</span>
1006        <span class="identifier">lock_</span><span class="special">=</span><span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">move</span><span class="special">();</span> <span class="comment">// Move ownership to nesting locker </span>
1007    <span class="special">}</span>
1008    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> <span class="special">}</span>
1009    <span class="identifier">lockable_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">tmp_lock_</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">();</span> <span class="special">}</span>
1010    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">lockable_type</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">l</span><span class="special">==</span><span class="identifier">mutex</span><span class="special">();</span> <span class="special">}</span>
1011
1012
1013<span class="keyword">private</span><span class="special">:</span>
1014    <span class="identifier">Locker</span><span class="special">&amp;</span> <span class="identifier">lock_</span><span class="special">;</span>
1015    <span class="identifier">Locker</span> <span class="identifier">tmp_lock_</span><span class="special">;</span>
1016<span class="special">};</span>
1017</pre>
1018<p>
1019            The <code class="computeroutput"><span class="identifier">externally_locked</span></code>
1020            get function is now a template function taking a Locker as parameters
1021            instead of a <code class="computeroutput"><span class="identifier">strict_lock</span></code>.
1022            We can add test in debug mode that ensure that the Lockable object is
1023            locked.
1024          </p>
1025<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
1026<span class="keyword">class</span> <span class="identifier">externally_locked</span> <span class="special">{</span>
1027<span class="keyword">public</span><span class="special">:</span>
1028    <span class="comment">// ...</span>
1029    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Locker</span><span class="special">&gt;</span>
1030    <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>
1031        <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>
1032
1033        <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>
1034        <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>
1035                <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>
1036<span class="preprocessor">#ifndef</span> <span class="identifier">BOOST_THREAD_EXTERNALLY_LOCKED_DONT_CHECK_OWNERSHIP</span>  <span class="comment">// define BOOST_THREAD_EXTERNALLY_LOCKED_NO_CHECK_OWNERSHIP if you don't want to check locker ownership</span>
1037        <span class="keyword">if</span> <span class="special">(!</span> <span class="identifier">lock</span> <span class="special">)</span> <span class="keyword">throw</span> <span class="identifier">lock_error</span><span class="special">();</span> <span class="comment">// run time check throw if no locked </span>
1038<span class="preprocessor">#endif</span>
1039<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span>
1040        <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">lock</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(&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>
1041<span class="preprocessor">#endif</span>
1042        <span class="keyword">return</span> <span class="identifier">obj_</span><span class="special">;</span>
1043    <span class="special">}</span>
1044<span class="special">};</span>
1045</pre>
1046<p>
1047            The <code class="computeroutput"><span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedFunction</span></code> function needs
1048            only to replace the <code class="computeroutput"><span class="identifier">strict_lock</span></code>
1049            by a <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code>.
1050          </p>
1051<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">AccountManager</span><span class="special">::</span><span class="identifier">AMoreComplicatedChecking2Savings</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">amount</span><span class="special">)</span> <span class="special">{</span>
1052    <span class="identifier">unique_lock</span><span class="special">&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>
1053    <span class="keyword">if</span> <span class="special">(</span><span class="identifier">some_condition</span><span class="special">())</span> <span class="special">{</span>
1054        <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span>
1055    <span class="special">}</span>
1056    <span class="special">{</span>
1057        <span class="identifier">nested_strict_lock</span><span class="special">&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>
1058        <span class="identifier">checkingAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Withdraw</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
1059        <span class="identifier">savingsAcct_</span><span class="special">.</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">guard</span><span class="special">).</span><span class="identifier">Deposit</span><span class="special">(</span><span class="identifier">amount</span><span class="special">);</span>
1060    <span class="special">}</span>
1061    <span class="identifier">guard1</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
1062<span class="special">}</span>
1063</pre>
1064</div>
1065</div>
1066<div class="section">
1067<div class="titlepage"><div><div><h4 class="title">
1068<a name="thread.synchronization.tutorial.with"></a><a class="link" href="synchronization.html#thread.synchronization.tutorial.with" title="Executing Around a Function">Executing Around
1069        a Function</a>
1070</h4></div></div></div>
1071<p>
1072          In particular, the library provides a way to lock around the execution
1073          of a function.
1074        </p>
1075<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
1076<span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span>
1077    <span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span>
1078    <span class="identifier">Function</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">,</span>
1079    <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span>
1080<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>
1081  <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>
1082  <span class="keyword">return</span> <span class="identifier">func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">)...);</span>
1083<span class="special">}</span>
1084</pre>
1085<p>
1086          that can be used with regular functions:
1087        </p>
1088<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">func</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&amp;);</span>
1089<span class="comment">//...</span>
1090<span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span>
1091<span class="keyword">int</span> <span class="identifier">a</span><span class="special">;</span>
1092<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">func</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">));</span>
1093</pre>
1094<p>
1095          with boost::bind:
1096        </p>
1097<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span>
1098    <span class="identifier">m</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">func</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">a</span><span class="special">))</span>
1099<span class="special">);</span>
1100</pre>
1101<p>
1102          or with lambda expression:
1103        </p>
1104<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">a</span><span class="special">;</span>
1105<span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">with_lock_guard</span><span class="special">(</span>
1106    <span class="identifier">m</span><span class="special">,</span>
1107    <span class="special">[&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>
1108      <span class="comment">// this scope is protected by mutex m</span>
1109      <span class="identifier">a</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
1110      <span class="keyword">return</span> <span class="identifier">x</span> <span class="special">+</span> <span class="number">4</span><span class="special">;</span>
1111    <span class="special">},</span>
1112    <span class="number">5</span>
1113<span class="special">);</span>
1114</pre>
1115</div>
1116</div>
1117<div class="section">
1118<div class="titlepage"><div><div><h3 class="title">
1119<a name="thread.synchronization.mutex_concepts"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts" title="Mutex Concepts">Mutex Concepts</a>
1120</h3></div></div></div>
1121<div class="toc"><dl class="toc">
1122<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable"><code class="computeroutput"><span class="identifier">BasicLockable</span></code> Concept</a></span></dt>
1123<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable"><code class="computeroutput"><span class="identifier">Lockable</span></code> Concept</a></span></dt>
1124<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive">Recursive
1125        Lockable Concept</a></span></dt>
1126<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> Concept</a></span></dt>
1127<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> Concept -- C++14</a></span></dt>
1128<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> Concept -- EXTENSION</a></span></dt>
1129</dl></div>
1130<p>
1131        A mutex object facilitates protection against data races and allows thread-safe
1132        synchronization of data between threads. A thread obtains ownership of a
1133        mutex object by calling one of the lock functions and relinquishes ownership
1134        by calling the corresponding unlock function. Mutexes may be either recursive
1135        or non-recursive, and may grant simultaneous ownership to one or many threads.
1136        <span class="bold"><strong>Boost.Thread</strong></span> supplies recursive and non-recursive
1137        mutexes with exclusive ownership semantics, along with a shared ownership
1138        (multiple-reader / single-writer) mutex.
1139      </p>
1140<p>
1141        <span class="bold"><strong>Boost.Thread</strong></span> supports four basic concepts
1142        for lockable objects: <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a>. Each mutex type
1143        implements one or more of these concepts, as do the various lock types.
1144      </p>
1145<div class="section">
1146<div class="titlepage"><div><div><h4 class="title">
1147<a name="thread.synchronization.mutex_concepts.basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code> Concept</a>
1148</h4></div></div></div>
1149<div class="toc"><dl class="toc">
1150<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span></code></a></span></dt>
1151<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span></code></a></span></dt>
1152<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable"><code class="computeroutput"><span class="identifier">is_basic_lockable</span></code> trait -- EXTENSION</a></span></dt>
1153</dl></div>
1154<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
1155
1156<span class="keyword">namespace</span> <span class="identifier">boost</span>
1157<span class="special">{</span>
1158
1159  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1160  <span class="keyword">class</span> <span class="identifier">BasicLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1161<span class="special">}</span>
1162</pre>
1163<p>
1164          The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept models exclusive
1165          ownership. A type <code class="computeroutput"><span class="identifier">L</span></code> meets
1166          the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> requirements if
1167          the following expressions are well-formed and have the specified semantics
1168          (<code class="computeroutput"><span class="identifier">m</span></code> denotes a value of type
1169          <code class="computeroutput"><span class="identifier">L</span></code>):
1170        </p>
1171<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1172<li class="listitem">
1173              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span></code></a><span class="special">();</span></code>
1174            </li>
1175<li class="listitem">
1176              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">();</span></code>
1177            </li>
1178</ul></div>
1179<p>
1180          Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
1181          must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>.
1182        </p>
1183<div class="section">
1184<div class="titlepage"><div><div><h5 class="title">
1185<a name="thread.synchronization.mutex_concepts.basic_lockable.lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">();</span></code></a>
1186</h5></div></div></div>
1187<div class="variablelist">
1188<p class="title"><b></b></p>
1189<dl class="variablelist">
1190<dt><span class="term">Requires:</span></dt>
1191<dd><p>
1192                  The calling thread doesn't owns the mutex if the mutex is not recursive.
1193                </p></dd>
1194<dt><span class="term">Effects:</span></dt>
1195<dd><p>
1196                  The current thread blocks until ownership can be obtained for the
1197                  current thread.
1198                </p></dd>
1199<dt><span class="term">Synchronization:</span></dt>
1200<dd><p>
1201                  Prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>
1202                  operations on the same object synchronizes with this operation.
1203                </p></dd>
1204<dt><span class="term">Postcondition:</span></dt>
1205<dd><p>
1206                  The current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1207                </p></dd>
1208<dt><span class="term">Return type:</span></dt>
1209<dd><p>
1210                  <code class="computeroutput"><span class="keyword">void</span></code>.
1211                </p></dd>
1212<dt><span class="term">Throws:</span></dt>
1213<dd><p>
1214                  <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1215                  error occurs.
1216                </p></dd>
1217<dt><span class="term">Error Conditions:</span></dt>
1218<dd>
1219<p>
1220                  <span class="bold"><strong>operation_not_permitted</strong></span>: if the
1221                  thread does not have the privilege to perform the operation.
1222                </p>
1223<p>
1224                  <span class="bold"><strong>resource_deadlock_would_occur</strong></span>:
1225                  if the implementation detects that a deadlock would occur.
1226                </p>
1227<p>
1228                  <span class="bold"><strong>device_or_resource_busy</strong></span>: if the
1229                  mutex is already locked and blocking is not possible.
1230                </p>
1231</dd>
1232<dt><span class="term">Thread safety:</span></dt>
1233<dd><p>
1234                  If an exception is thrown then a lock shall not have been acquired
1235                  for the current thread.
1236                </p></dd>
1237</dl>
1238</div>
1239</div>
1240<div class="section">
1241<div class="titlepage"><div><div><h5 class="title">
1242<a name="thread.synchronization.mutex_concepts.basic_lockable.unlock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span></code></a>
1243</h5></div></div></div>
1244<div class="variablelist">
1245<p class="title"><b></b></p>
1246<dl class="variablelist">
1247<dt><span class="term">Requires:</span></dt>
1248<dd><p>
1249                  The current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1250                </p></dd>
1251<dt><span class="term">Synchronization:</span></dt>
1252<dd><p>
1253                  This operation synchronizes with subsequent lock operations that
1254                  obtain ownership on the same object.
1255                </p></dd>
1256<dt><span class="term">Effects:</span></dt>
1257<dd><p>
1258                  Releases a lock on <code class="computeroutput"><span class="identifier">m</span></code>
1259                  by the current thread.
1260                </p></dd>
1261<dt><span class="term">Return type:</span></dt>
1262<dd><p>
1263                  <code class="computeroutput"><span class="keyword">void</span></code>.
1264                </p></dd>
1265<dt><span class="term">Throws:</span></dt>
1266<dd><p>
1267                  Nothing.
1268                </p></dd>
1269</dl>
1270</div>
1271</div>
1272<div class="section">
1273<div class="titlepage"><div><div><h5 class="title">
1274<a name="thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.is_basic_lockable" title="is_basic_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_basic_lockable</span></code> trait -- EXTENSION</a>
1275</h5></div></div></div>
1276<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1277
1278<span class="keyword">namespace</span> <span class="identifier">boost</span>
1279<span class="special">{</span>
1280  <span class="keyword">namespace</span> <span class="identifier">sync</span>
1281  <span class="special">{</span>
1282    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1283    <span class="keyword">class</span> <span class="identifier">is_basic_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1284  <span class="special">}</span>
1285<span class="special">}</span>
1286</pre>
1287<p>
1288            Some of the algorithms on mutexes use this trait via SFINAE.
1289          </p>
1290<p>
1291            This trait is true_type if the parameter L meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements.
1292          </p>
1293<div class="warning"><table border="0" summary="Warning">
1294<tr>
1295<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1296<th align="left">Warning</th>
1297</tr>
1298<tr><td align="left" valign="top"><p>
1299              If BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES is defined you will need
1300              to specialize this traits for the models of BasicLockable you could
1301              build.
1302            </p></td></tr>
1303</table></div>
1304</div>
1305</div>
1306<div class="section">
1307<div class="titlepage"><div><div><h4 class="title">
1308<a name="thread.synchronization.mutex_concepts.lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> Concept</a>
1309</h4></div></div></div>
1310<div class="toc"><dl class="toc">
1311<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a></span></dt>
1312<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.lockable.is_lockable"><code class="computeroutput"><span class="identifier">is_lockable</span></code> trait -- EXTENSION</a></span></dt>
1313</dl></div>
1314<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
1315<span class="keyword">namespace</span> <span class="identifier">boost</span>
1316<span class="special">{</span>
1317  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1318  <span class="keyword">class</span> <span class="identifier">Lockable</span><span class="special">;</span>
1319<span class="special">}</span>
1320</pre>
1321<p>
1322          A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements if it meets
1323          the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> requirements and
1324          the following expressions are well-formed and have the specified semantics
1325          (<code class="computeroutput"><span class="identifier">m</span></code> denotes a value of type
1326          <code class="computeroutput"><span class="identifier">L</span></code>):
1327        </p>
1328<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1329              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span></code></a><span class="special">()</span></code>
1330            </li></ul></div>
1331<p>
1332          Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
1333          must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>.
1334        </p>
1335<div class="section">
1336<div class="titlepage"><div><div><h5 class="title">
1337<a name="thread.synchronization.mutex_concepts.lockable.try_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a>
1338</h5></div></div></div>
1339<div class="variablelist">
1340<p class="title"><b></b></p>
1341<dl class="variablelist">
1342<dt><span class="term">Requires:</span></dt>
1343<dd><p>
1344                  The calling thread doesn't owns the mutex if the mutex is not recursive.
1345                </p></dd>
1346<dt><span class="term">Effects:</span></dt>
1347<dd><p>
1348                  Attempt to obtain ownership for the current thread without blocking.
1349                </p></dd>
1350<dt><span class="term">Synchronization:</span></dt>
1351<dd><p>
1352                  If <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>
1353                  returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code> operations on the same object
1354                  synchronize with this operation.
1355                </p></dd>
1356<dt><span class="term">Note:</span></dt>
1357<dd><p>
1358                  Since <code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code>
1359                  does not synchronize with a failed subsequent <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code>, the visibility rules are weak
1360                  enough that little would be known about the state after a failure,
1361                  even in the absence of spurious failures.
1362                </p></dd>
1363<dt><span class="term">Return type:</span></dt>
1364<dd><p>
1365                  <code class="computeroutput"><span class="keyword">bool</span></code>.
1366                </p></dd>
1367<dt><span class="term">Returns:</span></dt>
1368<dd><p>
1369                  <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1370                  was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1371                  otherwise.
1372                </p></dd>
1373<dt><span class="term">Postcondition:</span></dt>
1374<dd><p>
1375                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1376                  the current thread owns the <code class="computeroutput"><span class="identifier">m</span></code>.
1377                </p></dd>
1378<dt><span class="term">Throws:</span></dt>
1379<dd><p>
1380                  Nothing.
1381                </p></dd>
1382</dl>
1383</div>
1384</div>
1385<div class="section">
1386<div class="titlepage"><div><div><h5 class="title">
1387<a name="thread.synchronization.mutex_concepts.lockable.is_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.is_lockable" title="is_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_lockable</span></code> trait -- EXTENSION</a>
1388</h5></div></div></div>
1389<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1390<span class="keyword">namespace</span> <span class="identifier">boost</span>
1391<span class="special">{</span>
1392  <span class="keyword">namespace</span> <span class="identifier">sync</span>
1393  <span class="special">{</span>
1394    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1395    <span class="keyword">class</span> <span class="identifier">is_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1396  <span class="special">}</span>
1397<span class="special">}</span>
1398</pre>
1399<p>
1400            Some of the algorithms on mutexes use this trait via SFINAE.
1401          </p>
1402<p>
1403            This trait is true_type if the parameter L meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements.
1404          </p>
1405<div class="warning"><table border="0" summary="Warning">
1406<tr>
1407<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1408<th align="left">Warning</th>
1409</tr>
1410<tr><td align="left" valign="top"><p>
1411              If BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES is defined you will need
1412              to specialize this traits for the models of Lockable you could build.
1413            </p></td></tr>
1414</table></div>
1415</div>
1416</div>
1417<div class="section">
1418<div class="titlepage"><div><div><h4 class="title">
1419<a name="thread.synchronization.mutex_concepts.recursive"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive" title="Recursive Lockable Concept">Recursive
1420        Lockable Concept</a>
1421</h4></div></div></div>
1422<div class="toc"><dl class="toc">
1423<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole"><code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code> trait --
1424          EXTENSION</a></span></dt>
1425<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable"><code class="computeroutput"><span class="identifier">is_recursive_basic_lockable</span></code> trait --
1426          EXTENSION</a></span></dt>
1427<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_lockable"><code class="computeroutput"><span class="identifier">is_recursive_lockable</span></code> trait -- EXTENSION</a></span></dt>
1428</dl></div>
1429<p>
1430          The user could require that the mutex passed to an algorithm is a recursive
1431          one. Whether a lockable is recursive or not can not be checked using template
1432          meta-programming. This is the motivation for the following trait.
1433        </p>
1434<div class="section">
1435<div class="titlepage"><div><div><h5 class="title">
1436<a name="thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_mutex_sur_parole" title="is_recursive_mutex_sur_parole trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code> trait --
1437          EXTENSION</a>
1438</h5></div></div></div>
1439<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1440
1441<span class="keyword">namespace</span> <span class="identifier">boost</span>
1442<span class="special">{</span>
1443  <span class="keyword">namespace</span> <span class="identifier">sync</span>
1444  <span class="special">{</span>
1445    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1446    <span class="keyword">class</span> <span class="identifier">is_recursive_mutex_sur_parole</span><span class="special">:</span> <span class="identifier">false_type</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1447    <span class="keyword">template</span><span class="special">&lt;&gt;</span>
1448    <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>
1449    <span class="keyword">template</span><span class="special">&lt;&gt;</span>
1450    <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>
1451  <span class="special">}</span>
1452<span class="special">}</span>
1453</pre>
1454<p>
1455            The trait <code class="computeroutput"><span class="identifier">is_recursive_mutex_sur_parole</span></code>
1456            is <code class="computeroutput"><span class="identifier">false_type</span></code> by default
1457            and is specialized for the provide <code class="computeroutput"><span class="identifier">recursive_mutex</span></code>
1458            and <code class="computeroutput"><span class="identifier">timed_recursive_mutex</span></code>.
1459          </p>
1460<p>
1461            It should be specialized by the user providing other model of recursive
1462            lockable.
1463          </p>
1464</div>
1465<div class="section">
1466<div class="titlepage"><div><div><h5 class="title">
1467<a name="thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_basic_lockable" title="is_recursive_basic_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_basic_lockable</span></code> trait --
1468          EXTENSION</a>
1469</h5></div></div></div>
1470<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1471<span class="keyword">namespace</span> <span class="identifier">boost</span>
1472<span class="special">{</span>
1473  <span class="keyword">namespace</span> <span class="identifier">sync</span>
1474  <span class="special">{</span>
1475    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1476    <span class="keyword">class</span> <span class="identifier">is_recursive_basic_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1477  <span class="special">}</span>
1478<span class="special">}</span>
1479</pre>
1480<p>
1481            This traits is true_type if is_basic_lockable and is_recursive_mutex_sur_parole.
1482          </p>
1483</div>
1484<div class="section">
1485<div class="titlepage"><div><div><h5 class="title">
1486<a name="thread.synchronization.mutex_concepts.recursive.is_recursive_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.recursive.is_recursive_lockable" title="is_recursive_lockable trait -- EXTENSION"><code class="computeroutput"><span class="identifier">is_recursive_lockable</span></code> trait -- EXTENSION</a>
1487</h5></div></div></div>
1488<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_traits.hpp&gt; </span>
1489<span class="keyword">namespace</span> <span class="identifier">boost</span>
1490<span class="special">{</span>
1491  <span class="keyword">namespace</span> <span class="identifier">sync</span>
1492  <span class="special">{</span>
1493    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1494    <span class="keyword">class</span> <span class="identifier">is_recursive_lockable</span><span class="special">;//</span> <span class="identifier">EXTENSION</span>
1495  <span class="special">}</span>
1496<span class="special">}</span>
1497</pre>
1498<p>
1499            This traits is true_type if is_lockable and is_recursive_mutex_sur_parole.
1500          </p>
1501</div>
1502</div>
1503<div class="section">
1504<div class="titlepage"><div><div><h4 class="title">
1505<a name="thread.synchronization.mutex_concepts.timed_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> Concept</a>
1506</h4></div></div></div>
1507<div class="toc"><dl class="toc">
1508<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
1509<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
1510<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
1511<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
1512</dl></div>
1513<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
1514
1515<span class="keyword">namespace</span> <span class="identifier">boost</span>
1516<span class="special">{</span>
1517  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1518  <span class="keyword">class</span> <span class="identifier">TimedLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
1519<span class="special">}</span>
1520</pre>
1521<p>
1522          The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> refines
1523          the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to add support
1524          for timeouts when trying to acquire the lock.
1525        </p>
1526<p>
1527          A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> requirements if
1528          it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> requirements and the
1529          following expressions are well-formed and have the specified semantics.
1530        </p>
1531<p>
1532          <span class="bold"><strong>Variables:</strong></span>
1533        </p>
1534<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1535<li class="listitem">
1536              <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
1537              type <code class="computeroutput"><span class="identifier">L</span></code>,
1538            </li>
1539<li class="listitem">
1540              <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1541              value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
1542              and
1543            </li>
1544<li class="listitem">
1545              <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1546              value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
1547            </li>
1548</ul></div>
1549<p>
1550          <span class="bold"><strong>Expressions:</strong></span>
1551        </p>
1552<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1553<li class="listitem">
1554              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
1555            </li>
1556<li class="listitem">
1557              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
1558            </li>
1559</ul></div>
1560<p>
1561          Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a> must be released
1562          through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a>.
1563        </p>
1564<div class="section">
1565<div class="titlepage"><div><div><h5 class="title">
1566<a name="thread.synchronization.mutex_concepts.timed_lockable.try_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
1567</h5></div></div></div>
1568<div class="variablelist">
1569<p class="title"><b></b></p>
1570<dl class="variablelist">
1571<dt><span class="term">Requires:</span></dt>
1572<dd><p>
1573                  The calling thread doesn't owns the mutex if the mutex is not recursive.
1574                </p></dd>
1575<dt><span class="term">Effects:</span></dt>
1576<dd><p>
1577                  Attempt to obtain ownership for the current thread. Blocks until
1578                  ownership can be obtained, or the specified time is reached. If
1579                  the specified time has already passed, behaves as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>.
1580                </p></dd>
1581<dt><span class="term">Synchronization:</span></dt>
1582<dd><p>
1583                  If <code class="computeroutput"><span class="identifier">try_lock_until</span><span class="special">()</span></code> returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>
1584                  operations on the same object synchronize with this operation.
1585                </p></dd>
1586<dt><span class="term">Return type:</span></dt>
1587<dd><p>
1588                  <code class="computeroutput"><span class="keyword">bool</span></code>.
1589                </p></dd>
1590<dt><span class="term">Returns:</span></dt>
1591<dd><p>
1592                  <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1593                  was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1594                  otherwise.
1595                </p></dd>
1596<dt><span class="term">Postcondition:</span></dt>
1597<dd><p>
1598                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1599                  the current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1600                </p></dd>
1601<dt><span class="term">Throws:</span></dt>
1602<dd><p>
1603                  Nothing.
1604                </p></dd>
1605</dl>
1606</div>
1607</div>
1608<div class="section">
1609<div class="titlepage"><div><div><h5 class="title">
1610<a name="thread.synchronization.mutex_concepts.timed_lockable.try_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
1611</h5></div></div></div>
1612<div class="variablelist">
1613<p class="title"><b></b></p>
1614<dl class="variablelist">
1615<dt><span class="term">Requires:</span></dt>
1616<dd><p>
1617                  The calling thread doesn't owns the mutex if the mutex is not recursive.
1618                </p></dd>
1619<dt><span class="term">Effects:</span></dt>
1620<dd><p>
1621                  As-if <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">rel_time</span><span class="special">)</span></code>.
1622                </p></dd>
1623<dt><span class="term">Synchronization:</span></dt>
1624<dd><p>
1625                  If <code class="computeroutput"><span class="identifier">try_lock_for</span><span class="special">()</span></code> returns true, prior <code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code>
1626                  operations on the same object synchronize with this operation.
1627                </p></dd>
1628</dl>
1629</div>
1630</div>
1631<div class="warning"><table border="0" summary="Warning">
1632<tr>
1633<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1634<th align="left">Warning</th>
1635</tr>
1636<tr><td align="left" valign="top">
1637<p>
1638            DEPRECATED since 4.00. The following expressions were required on version
1639            2, but are now deprecated.
1640          </p>
1641<p>
1642            Use instead <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a>.
1643          </p>
1644</td></tr>
1645</table></div>
1646<p>
1647          <span class="bold"><strong>Variables:</strong></span>
1648        </p>
1649<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1650<li class="listitem">
1651              <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1652              value of an instantiation of an unspecified <code class="computeroutput"><span class="identifier">DurationType</span></code>
1653              arithmetic compatible with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>,
1654              and
1655            </li>
1656<li class="listitem">
1657              <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1658              value of an instantiation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>:
1659            </li>
1660</ul></div>
1661<p>
1662          <span class="bold"><strong>Expressions:</strong></span>
1663        </p>
1664<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1665<li class="listitem">
1666              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
1667            </li>
1668<li class="listitem">
1669              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
1670            </li>
1671</ul></div>
1672<p>
1673          Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
1674          must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>.
1675        </p>
1676<div class="section">
1677<div class="titlepage"><div><div><h5 class="title">
1678<a name="thread.synchronization.mutex_concepts.timed_lockable.timed_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
1679</h5></div></div></div>
1680<div class="variablelist">
1681<p class="title"><b></b></p>
1682<dl class="variablelist">
1683<dt><span class="term">Effects:</span></dt>
1684<dd><p>
1685                  Attempt to obtain ownership for the current thread. Blocks until
1686                  ownership can be obtained, or the specified time is reached. If
1687                  the specified time has already passed, behaves as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>.
1688                </p></dd>
1689<dt><span class="term">Returns:</span></dt>
1690<dd><p>
1691                  <code class="computeroutput"><span class="keyword">true</span></code> if ownership
1692                  was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1693                  otherwise.
1694                </p></dd>
1695<dt><span class="term">Postcondition:</span></dt>
1696<dd><p>
1697                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1698                  the current thread owns <code class="computeroutput"><span class="identifier">m</span></code>.
1699                </p></dd>
1700<dt><span class="term">Throws:</span></dt>
1701<dd><p>
1702                  <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1703                  error occurs.
1704                </p></dd>
1705</dl>
1706</div>
1707</div>
1708<div class="section">
1709<div class="titlepage"><div><div><h5 class="title">
1710<a name="thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
1711</h5></div></div></div>
1712<div class="variablelist">
1713<p class="title"><b></b></p>
1714<dl class="variablelist">
1715<dt><span class="term">Effects:</span></dt>
1716<dd><p>
1717                  As-if <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()+</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>.
1718                </p></dd>
1719</dl>
1720</div>
1721</div>
1722</div>
1723<div class="section">
1724<div class="titlepage"><div><div><h4 class="title">
1725<a name="thread.synchronization.mutex_concepts.shared_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> Concept -- C++14</a>
1726</h4></div></div></div>
1727<div class="toc"><dl class="toc">
1728<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a></span></dt>
1729<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a></span></dt>
1730<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
1731<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">))</span></code></a></span></dt>
1732<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a></span></dt>
1733<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
1734</dl></div>
1735<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
1736
1737<span class="keyword">namespace</span> <span class="identifier">boost</span>
1738<span class="special">{</span>
1739  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
1740  <span class="keyword">class</span> <span class="identifier">SharedLockable</span><span class="special">;</span>  <span class="comment">// C++14</span>
1741<span class="special">}</span>
1742</pre>
1743<p>
1744          The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> is a refinement
1745          of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> that allows
1746          for <span class="emphasis"><em>shared ownership</em></span> as well as <span class="emphasis"><em>exclusive
1747          ownership</em></span>. This is the standard multiple-reader / single-write
1748          model: at most one thread can have exclusive ownership, and if any thread
1749          does have exclusive ownership, no other threads can have shared or exclusive
1750          ownership. Alternatively, many threads may have shared ownership.
1751        </p>
1752<p>
1753          A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> requirements if
1754          it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> requirements and
1755          the following expressions are well-formed and have the specified semantics.
1756        </p>
1757<p>
1758          <span class="bold"><strong>Variables:</strong></span>
1759        </p>
1760<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1761<li class="listitem">
1762              <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
1763              type <code class="computeroutput"><span class="identifier">L</span></code>,
1764            </li>
1765<li class="listitem">
1766              <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
1767              value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
1768              and
1769            </li>
1770<li class="listitem">
1771              <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1772              value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
1773            </li>
1774</ul></div>
1775<p>
1776          <span class="bold"><strong>Expressions:</strong></span>
1777        </p>
1778<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1779<li class="listitem">
1780              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">();</span></code>
1781            </li>
1782<li class="listitem">
1783              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span></code></a><span class="special">()</span></code>
1784            </li>
1785<li class="listitem">
1786              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
1787            </li>
1788<li class="listitem">
1789              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
1790            </li>
1791<li class="listitem">
1792              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">();</span></code>
1793            </li>
1794</ul></div>
1795<p>
1796          Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>,
1797          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>,
1798          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a> must be
1799          released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>.
1800        </p>
1801<div class="section">
1802<div class="titlepage"><div><div><h5 class="title">
1803<a name="thread.synchronization.mutex_concepts.shared_lockable.lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a>
1804</h5></div></div></div>
1805<div class="variablelist">
1806<p class="title"><b></b></p>
1807<dl class="variablelist">
1808<dt><span class="term">Effects:</span></dt>
1809<dd><p>
1810                  The current thread blocks until shared ownership can be obtained
1811                  for the current thread.
1812                </p></dd>
1813<dt><span class="term">Postcondition:</span></dt>
1814<dd><p>
1815                  The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1816                </p></dd>
1817<dt><span class="term">Throws:</span></dt>
1818<dd><p>
1819                  <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1820                  error occurs.
1821                </p></dd>
1822</dl>
1823</div>
1824</div>
1825<div class="section">
1826<div class="titlepage"><div><div><h5 class="title">
1827<a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>
1828</h5></div></div></div>
1829<div class="variablelist">
1830<p class="title"><b></b></p>
1831<dl class="variablelist">
1832<dt><span class="term">Effects:</span></dt>
1833<dd><p>
1834                  Attempt to obtain shared ownership for the current thread without
1835                  blocking.
1836                </p></dd>
1837<dt><span class="term">Returns:</span></dt>
1838<dd><p>
1839                  <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1840                  was obtained for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1841                  otherwise.
1842                </p></dd>
1843<dt><span class="term">Postcondition:</span></dt>
1844<dd><p>
1845                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1846                  the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1847                </p></dd>
1848<dt><span class="term">Throws:</span></dt>
1849<dd><p>
1850                  <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1851                  error occurs.
1852                </p></dd>
1853</dl>
1854</div>
1855</div>
1856<div class="section">
1857<div class="titlepage"><div><div><h5 class="title">
1858<a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
1859</h5></div></div></div>
1860<div class="variablelist">
1861<p class="title"><b></b></p>
1862<dl class="variablelist">
1863<dt><span class="term">Effects:</span></dt>
1864<dd><p>
1865                  Attempt to obtain shared ownership for the current thread. Blocks
1866                  until shared ownership can be obtained, or the specified duration
1867                  is elapsed. If the specified duration is already elapsed, behaves
1868                  as <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>.
1869                </p></dd>
1870<dt><span class="term">Returns:</span></dt>
1871<dd><p>
1872                  <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1873                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1874                  otherwise.
1875                </p></dd>
1876<dt><span class="term">Postcondition:</span></dt>
1877<dd><p>
1878                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1879                  the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1880                </p></dd>
1881<dt><span class="term">Throws:</span></dt>
1882<dd><p>
1883                  <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1884                  error occurs.
1885                </p></dd>
1886</dl>
1887</div>
1888</div>
1889<div class="section">
1890<div class="titlepage"><div><div><h5 class="title">
1891<a name="thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">))</span></code></a>
1892</h5></div></div></div>
1893<div class="variablelist">
1894<p class="title"><b></b></p>
1895<dl class="variablelist">
1896<dt><span class="term">Effects:</span></dt>
1897<dd><p>
1898                  Attempt to obtain shared ownership for the current thread. Blocks
1899                  until shared ownership can be obtained, or the specified time is
1900                  reached. If the specified time has already passed, behaves as
1901                  <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>.
1902                </p></dd>
1903<dt><span class="term">Returns:</span></dt>
1904<dd><p>
1905                  <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1906                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1907                  otherwise.
1908                </p></dd>
1909<dt><span class="term">Postcondition:</span></dt>
1910<dd><p>
1911                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
1912                  the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1913                </p></dd>
1914<dt><span class="term">Throws:</span></dt>
1915<dd><p>
1916                  <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
1917                  error occurs.
1918                </p></dd>
1919</dl>
1920</div>
1921</div>
1922<div class="section">
1923<div class="titlepage"><div><div><h5 class="title">
1924<a name="thread.synchronization.mutex_concepts.shared_lockable.unlock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>
1925</h5></div></div></div>
1926<div class="variablelist">
1927<p class="title"><b></b></p>
1928<dl class="variablelist">
1929<dt><span class="term">Precondition:</span></dt>
1930<dd><p>
1931                  The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1932                </p></dd>
1933<dt><span class="term">Effects:</span></dt>
1934<dd><p>
1935                  Releases shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>
1936                  by the current thread.
1937                </p></dd>
1938<dt><span class="term">Postcondition:</span></dt>
1939<dd><p>
1940                  The current thread no longer has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
1941                </p></dd>
1942<dt><span class="term">Throws:</span></dt>
1943<dd><p>
1944                  Nothing
1945                </p></dd>
1946</dl>
1947</div>
1948</div>
1949<div class="warning"><table border="0" summary="Warning">
1950<tr>
1951<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
1952<th align="left">Warning</th>
1953</tr>
1954<tr><td align="left" valign="top">
1955<p>
1956            DEPRECATED since 3.00. The following expressions were required on version
1957            2, but are now deprecated.
1958          </p>
1959<p>
1960            Use instead <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a>.
1961          </p>
1962</td></tr>
1963</table></div>
1964<p>
1965          <span class="bold"><strong>Variables:</strong></span>
1966        </p>
1967<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1968              <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
1969              value of an instantiation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span></code>:
1970            </li></ul></div>
1971<p>
1972          <span class="bold"><strong>Expressions:</strong></span>
1973        </p>
1974<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
1975              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code>
1976            </li></ul></div>
1977<p>
1978          Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a>
1979          must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>.
1980        </p>
1981<div class="section">
1982<div class="titlepage"><div><div><h5 class="title">
1983<a name="thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
1984</h5></div></div></div>
1985<div class="variablelist">
1986<p class="title"><b></b></p>
1987<dl class="variablelist">
1988<dt><span class="term">Effects:</span></dt>
1989<dd><p>
1990                  Attempt to obtain shared ownership for the current thread. Blocks
1991                  until shared ownership can be obtained, or the specified time is
1992                  reached. If the specified time has already passed, behaves as
1993                  <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>.
1994                </p></dd>
1995<dt><span class="term">Returns:</span></dt>
1996<dd><p>
1997                  <code class="computeroutput"><span class="keyword">true</span></code> if shared ownership
1998                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
1999                  otherwise.
2000                </p></dd>
2001<dt><span class="term">Postcondition:</span></dt>
2002<dd><p>
2003                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2004                  the current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2005                </p></dd>
2006<dt><span class="term">Throws:</span></dt>
2007<dd><p>
2008                  <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
2009                  error occurs.
2010                </p></dd>
2011</dl>
2012</div>
2013</div>
2014</div>
2015<div class="section">
2016<div class="titlepage"><div><div><h4 class="title">
2017<a name="thread.synchronization.mutex_concepts.upgrade_lockable"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> Concept -- EXTENSION</a>
2018</h4></div></div></div>
2019<div class="toc"><dl class="toc">
2020<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a></span></dt>
2021<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a></span></dt>
2022<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade</span><span class="special">()</span></code></a></span></dt>
2023<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
2024<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
2025<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code></a></span></dt>
2026<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
2027<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
2028<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_shared</span><span class="special">()</span></code></a></span></dt>
2029<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">()</span></code></a></span></dt>
2030<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
2031<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
2032<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_upgrade</span><span class="special">()</span></code></a></span></dt>
2033<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock</span><span class="special">()</span></code></a></span></dt>
2034<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">()</span></code></a></span></dt>
2035<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
2036<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
2037<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">()</span></code></a></span></dt>
2038</dl></div>
2039<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lockable_concepts.hpp&gt; </span>
2040
2041<span class="keyword">namespace</span> <span class="identifier">boost</span>
2042<span class="special">{</span>
2043  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">L</span><span class="special">&gt;</span>
2044  <span class="keyword">class</span> <span class="identifier">UpgradeLockable</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
2045<span class="special">}</span>
2046</pre>
2047<p>
2048          The <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a> is a refinement
2049          of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> that allows
2050          for <span class="emphasis"><em>upgradable ownership</em></span> as well as <span class="emphasis"><em>shared
2051          ownership</em></span> and <span class="emphasis"><em>exclusive ownership</em></span>. This
2052          is an extension to the multiple-reader / single-write model provided by
2053          the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a>: a single
2054          thread may have <span class="emphasis"><em>upgradable ownership</em></span> at the same time
2055          as others have <span class="emphasis"><em>shared ownership</em></span>. The thread with
2056          <span class="emphasis"><em>upgradable ownership</em></span> may at any time attempt to upgrade
2057          that ownership to <span class="emphasis"><em>exclusive ownership</em></span>. If no other
2058          threads have shared ownership, the upgrade is completed immediately, and
2059          the thread now has <span class="emphasis"><em>exclusive ownership</em></span>, which must
2060          be relinquished by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>,
2061          just as if it had been acquired by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>.
2062        </p>
2063<p>
2064          If a thread with <span class="emphasis"><em>upgradable ownership</em></span> tries to upgrade
2065          whilst other threads have <span class="emphasis"><em>shared ownership</em></span>, the attempt
2066          will fail and the thread will block until <span class="emphasis"><em>exclusive ownership</em></span>
2067          can be acquired.
2068        </p>
2069<p>
2070          Ownership can also be <span class="emphasis"><em>downgraded</em></span> as well as <span class="emphasis"><em>upgraded</em></span>:
2071          exclusive ownership of an implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a> can be
2072          downgraded to upgradable ownership or shared ownership, and upgradable
2073          ownership can be downgraded to plain shared ownership.
2074        </p>
2075<p>
2076          A type <code class="computeroutput"><span class="identifier">L</span></code> meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> requirements if
2077          it meets the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> requirements and
2078          the following expressions are well-formed and have the specified semantics.
2079        </p>
2080<p>
2081          <span class="bold"><strong>Variables:</strong></span>
2082        </p>
2083<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2084<li class="listitem">
2085              <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
2086              type <code class="computeroutput"><span class="identifier">L</span></code>,
2087            </li>
2088<li class="listitem">
2089              <code class="computeroutput"><span class="identifier">rel_time</span></code> denotes a
2090              value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code>,
2091              and
2092            </li>
2093<li class="listitem">
2094              <code class="computeroutput"><span class="identifier">abs_time</span></code> denotes a
2095              value of an instantiation of <code class="computeroutput"><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span></code>:
2096            </li>
2097</ul></div>
2098<p>
2099          <span class="bold"><strong>Expressions:</strong></span>
2100        </p>
2101<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2102<li class="listitem">
2103              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">lock_upgrade</span></code></a><span class="special">();</span></code>
2104            </li>
2105<li class="listitem">
2106              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code>
2107            </li>
2108<li class="listitem">
2109              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code>
2110            </li>
2111<li class="listitem">
2112              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
2113            </li>
2114<li class="listitem">
2115              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
2116            </li>
2117<li class="listitem">
2118              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared" title="m.unlock_and_lock_shared()"><code class="computeroutput"><span class="identifier">unlock_and_lock_shared</span></code></a><span class="special">()</span></code>
2119            </li>
2120<li class="listitem">
2121              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade" title="m.unlock_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_and_lock_upgrade</span></code></a><span class="special">();</span></code>
2122            </li>
2123<li class="listitem">
2124              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock" title="m.unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">unlock_upgrade_and_lock</span></code></a><span class="special">();</span></code>
2125            </li>
2126<li class="listitem">
2127              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code>
2128            </li>
2129<li class="listitem">
2130              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>
2131            </li>
2132<li class="listitem">
2133              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until" title="m.try_unlock_upgrade_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>
2134            </li>
2135<li class="listitem">
2136              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared" title="m.unlock_upgrade_and_lock_shared()"><code class="computeroutput"><span class="identifier">unlock_upgrade_and_lock_shared</span></code></a><span class="special">();</span></code>
2137            </li>
2138</ul></div>
2139<p>
2140          If `BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS is defined the
2141          following expressions are also required:
2142        </p>
2143<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2144<li class="listitem">
2145              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">();</span></code>
2146            </li>
2147<li class="listitem">
2148              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">);</span></code>
2149            </li>
2150<li class="listitem">
2151              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code>
2152            </li>
2153<li class="listitem">
2154              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">();</span></code>
2155            </li>
2156<li class="listitem">
2157              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">);</span></code>
2158            </li>
2159<li class="listitem">
2160              <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">);</span></code>
2161            </li>
2162</ul></div>
2163<p>
2164          Lock ownership acquired through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a>
2165          must be released through a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>.
2166          If the ownership type is changed through a call to one of the <code class="computeroutput"><span class="identifier">unlock_xxx_and_lock_yyy</span><span class="special">()</span></code>
2167          functions, ownership must be released through a call to the unlock function
2168          corresponding to the new level of ownership.
2169        </p>
2170<div class="section">
2171<div class="titlepage"><div><div><h5 class="title">
2172<a name="thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.lock_upgrade" title="m.lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_upgrade</span><span class="special">()</span></code></a>
2173</h5></div></div></div>
2174<div class="variablelist">
2175<p class="title"><b></b></p>
2176<dl class="variablelist">
2177<dt><span class="term">Precondition:</span></dt>
2178<dd><p>
2179                  The calling thread has no ownership of the mutex.
2180                </p></dd>
2181<dt><span class="term">Effects:</span></dt>
2182<dd><p>
2183                  The current thread blocks until upgrade ownership can be obtained
2184                  for the current thread.
2185                </p></dd>
2186<dt><span class="term">Postcondition:</span></dt>
2187<dd><p>
2188                  The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2189                </p></dd>
2190<dt><span class="term">Synchronization:</span></dt>
2191<dd><p>
2192                  Prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object
2193                  synchronize with this operation.
2194                </p></dd>
2195<dt><span class="term">Throws:</span></dt>
2196<dd><p>
2197                  <code class="computeroutput"><span class="identifier">lock_error</span></code> if an
2198                  error occurs.
2199                </p></dd>
2200</dl>
2201</div>
2202</div>
2203<div class="section">
2204<div class="titlepage"><div><div><h5 class="title">
2205<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>
2206</h5></div></div></div>
2207<div class="variablelist">
2208<p class="title"><b></b></p>
2209<dl class="variablelist">
2210<dt><span class="term">Precondition:</span></dt>
2211<dd><p>
2212                  The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2213                </p></dd>
2214<dt><span class="term">Effects:</span></dt>
2215<dd><p>
2216                  Releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2217                  by the current thread.
2218                </p></dd>
2219<dt><span class="term">Postcondition:</span></dt>
2220<dd><p>
2221                  The current thread no longer has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2222                </p></dd>
2223<dt><span class="term">Synchronization:</span></dt>
2224<dd><p>
2225                  This operation synchronizes with subsequent lock operations that
2226                  obtain ownership on the same object.
2227                </p></dd>
2228<dt><span class="term">Throws:</span></dt>
2229<dd><p>
2230                  Nothing
2231                </p></dd>
2232</dl>
2233</div>
2234</div>
2235<div class="section">
2236<div class="titlepage"><div><div><h5 class="title">
2237<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade</span><span class="special">()</span></code></a>
2238</h5></div></div></div>
2239<div class="variablelist">
2240<p class="title"><b></b></p>
2241<dl class="variablelist">
2242<dt><span class="term">Precondition:</span></dt>
2243<dd><p>
2244                  The calling thread has no ownership of the mutex.
2245                </p></dd>
2246<dt><span class="term">Effects:</span></dt>
2247<dd><p>
2248                  Attempts to obtain upgrade ownership of the mutex for the calling
2249                  thread without blocking. If upgrade ownership is not obtained,
2250                  there is no effect and try_lock_upgrade() immediately returns.
2251                </p></dd>
2252<dt><span class="term">Returns:</span></dt>
2253<dd><p>
2254                  <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2255                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2256                  otherwise.
2257                </p></dd>
2258<dt><span class="term">Postcondition:</span></dt>
2259<dd><p>
2260                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2261                  the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2262                </p></dd>
2263<dt><span class="term">Synchronization:</span></dt>
2264<dd><p>
2265                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object
2266                  synchronize with this operation.
2267                </p></dd>
2268<dt><span class="term">Throws:</span></dt>
2269<dd><p>
2270                  Nothing
2271                </p></dd>
2272</dl>
2273</div>
2274</div>
2275<div class="section">
2276<div class="titlepage"><div><div><h5 class="title">
2277<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
2278</h5></div></div></div>
2279<div class="variablelist">
2280<p class="title"><b></b></p>
2281<dl class="variablelist">
2282<dt><span class="term">Precondition:</span></dt>
2283<dd><p>
2284                  The calling thread has no ownership of the mutex.
2285                </p></dd>
2286<dt><span class="term">Effects:</span></dt>
2287<dd><p>
2288                  If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2289                  is not exactly convertible to the native tick period, the duration
2290                  shall be rounded up to the nearest native tick period. Attempts
2291                  to obtain upgrade lock ownership for the calling thread within
2292                  the relative timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>.
2293                  If the time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2294                  is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain
2295                  ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code>). The function returns within
2296                  the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2297                  only if it has obtained upgrade ownership of the mutex object.
2298                </p></dd>
2299<dt><span class="term">Returns:</span></dt>
2300<dd><p>
2301                  <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2302                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2303                  otherwise.
2304                </p></dd>
2305<dt><span class="term">Postcondition:</span></dt>
2306<dd><p>
2307                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2308                  the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2309                </p></dd>
2310<dt><span class="term">Synchronization:</span></dt>
2311<dd><p>
2312                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_for" title="m.try_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object
2313                  synchronize with this operation.
2314                </p></dd>
2315<dt><span class="term">Throws:</span></dt>
2316<dd><p>
2317                  Nothing
2318                </p></dd>
2319<dt><span class="term">Notes:</span></dt>
2320<dd><p>
2321                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2322                  is defined on Windows platform
2323                </p></dd>
2324</dl>
2325</div>
2326</div>
2327<div class="section">
2328<div class="titlepage"><div><div><h5 class="title">
2329<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
2330</h5></div></div></div>
2331<div class="variablelist">
2332<p class="title"><b></b></p>
2333<dl class="variablelist">
2334<dt><span class="term">Precondition:</span></dt>
2335<dd><p>
2336                  The calling thread has no ownership of the mutex.
2337                </p></dd>
2338<dt><span class="term">Effects:</span></dt>
2339<dd><p>
2340                  The function attempts to obtain upgrade ownership of the mutex.
2341                  If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2342                  already passed, the function attempts to obtain upgrade ownership
2343                  without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade" title="m.try_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_lock_upgrade</span></code></a><span class="special">()</span></code>). The function returns before
2344                  the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2345                  only if it has obtained upgrade ownership of the mutex object.
2346                </p></dd>
2347<dt><span class="term">Returns:</span></dt>
2348<dd><p>
2349                  <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2350                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2351                  otherwise.
2352                </p></dd>
2353<dt><span class="term">Postcondition:</span></dt>
2354<dd><p>
2355                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2356                  the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2357                </p></dd>
2358<dt><span class="term">Synchronization:</span></dt>
2359<dd><p>
2360                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_lock_upgrade_until" title="m.try_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> operations on the same object
2361                  synchronize with this operation.
2362                </p></dd>
2363<dt><span class="term">Throws:</span></dt>
2364<dd><p>
2365                  Nothing
2366                </p></dd>
2367<dt><span class="term">Notes:</span></dt>
2368<dd><p>
2369                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2370                  is defined on Windows platform
2371                </p></dd>
2372</dl>
2373</div>
2374</div>
2375<div class="section">
2376<div class="titlepage"><div><div><h5 class="title">
2377<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code></a>
2378</h5></div></div></div>
2379<div class="variablelist">
2380<p class="title"><b></b></p>
2381<dl class="variablelist">
2382<dt><span class="term">Precondition:</span></dt>
2383<dd><p>
2384                  The calling thread must hold a shared lock on the mutex.
2385                </p></dd>
2386<dt><span class="term">Effects:</span></dt>
2387<dd><p>
2388                  The function attempts to atomically convert the ownership from
2389                  shared to exclusive for the calling thread without blocking. For
2390                  this conversion to be successful, this thread must be the only
2391                  thread holding any ownership of the lock. If the conversion is
2392                  not successful, the shared ownership of m is retained.
2393                </p></dd>
2394<dt><span class="term">Returns:</span></dt>
2395<dd><p>
2396                  <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2397                  ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2398                  otherwise.
2399                </p></dd>
2400<dt><span class="term">Postcondition:</span></dt>
2401<dd><p>
2402                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2403                  the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2404                </p></dd>
2405<dt><span class="term">Synchronization:</span></dt>
2406<dd><p>
2407                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2408                  and subsequent lock operations on the same object synchronize with
2409                  this operation.
2410                </p></dd>
2411<dt><span class="term">Throws:</span></dt>
2412<dd><p>
2413                  Nothing
2414                </p></dd>
2415<dt><span class="term">Notes:</span></dt>
2416<dd><p>
2417                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
2418                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2419                  is defined on Windows platform
2420                </p></dd>
2421</dl>
2422</div>
2423</div>
2424<div class="section">
2425<div class="titlepage"><div><div><h5 class="title">
2426<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
2427</h5></div></div></div>
2428<div class="variablelist">
2429<p class="title"><b></b></p>
2430<dl class="variablelist">
2431<dt><span class="term">Precondition:</span></dt>
2432<dd><p>
2433                  The calling thread shall hold a shared lock on the mutex.
2434                </p></dd>
2435<dt><span class="term">Effects:</span></dt>
2436<dd><p>
2437                  If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2438                  is not exactly convertible to the native tick period, the duration
2439                  shall be rounded up to the nearest native tick period. The function
2440                  attempts to atomically convert the ownership from shared to exclusive
2441                  for the calling thread within the relative timeout specified by
2442                  <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2443                  time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2444                  is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain
2445                  exclusive ownership without blocking (as if by calling <code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>).
2446                  The function shall return within the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> only if it has obtained
2447                  exclusive ownership of the mutex object. For this conversion to
2448                  be successful, this thread must be the only thread holding any
2449                  ownership of the lock at the moment of conversion. If the conversion
2450                  is not successful, the shared ownership of the mutex is retained.
2451                </p></dd>
2452<dt><span class="term">Returns:</span></dt>
2453<dd><p>
2454                  <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2455                  ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2456                  otherwise.
2457                </p></dd>
2458<dt><span class="term">Postcondition:</span></dt>
2459<dd><p>
2460                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2461                  the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2462                </p></dd>
2463<dt><span class="term">Synchronization:</span></dt>
2464<dd><p>
2465                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2466                  and subsequent lock operations on the same object synchronize with
2467                  this operation.
2468                </p></dd>
2469<dt><span class="term">Throws:</span></dt>
2470<dd><p>
2471                  Nothing
2472                </p></dd>
2473<dt><span class="term">Notes:</span></dt>
2474<dd><p>
2475                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
2476                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2477                  is defined on Windows platform
2478                </p></dd>
2479</dl>
2480</div>
2481</div>
2482<div class="section">
2483<div class="titlepage"><div><div><h5 class="title">
2484<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
2485</h5></div></div></div>
2486<div class="variablelist">
2487<p class="title"><b></b></p>
2488<dl class="variablelist">
2489<dt><span class="term">Precondition:</span></dt>
2490<dd><p>
2491                  The calling thread shall hold a shared lock on the mutex.
2492                </p></dd>
2493<dt><span class="term">Effects:</span></dt>
2494<dd><p>
2495                  The function attempts to atomically convert the ownership from
2496                  shared to exclusive for the calling thread within the absolute
2497                  timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2498                  If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2499                  already passed, the function attempts to obtain exclusive ownership
2500                  without blocking (as if by calling <code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>). The function shall return before
2501                  the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2502                  only if it has obtained exclusive ownership of the mutex object.
2503                  For this conversion to be successful, this thread must be the only
2504                  thread holding any ownership of the lock at the moment of conversion.
2505                  If the conversion is not successful, the shared ownership of the
2506                  mutex is retained.
2507                </p></dd>
2508<dt><span class="term">Returns:</span></dt>
2509<dd><p>
2510                  <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2511                  ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2512                  otherwise.
2513                </p></dd>
2514<dt><span class="term">Postcondition:</span></dt>
2515<dd><p>
2516                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2517                  the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2518                </p></dd>
2519<dt><span class="term">Synchronization:</span></dt>
2520<dd><p>
2521                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2522                  and subsequent lock operations on the same object synchronize with
2523                  this operation.
2524                </p></dd>
2525<dt><span class="term">Throws:</span></dt>
2526<dd><p>
2527                  Nothing
2528                </p></dd>
2529<dt><span class="term">Notes:</span></dt>
2530<dd><p>
2531                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
2532                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2533                  is defined on Windows platform
2534                </p></dd>
2535</dl>
2536</div>
2537</div>
2538<div class="section">
2539<div class="titlepage"><div><div><h5 class="title">
2540<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_shared" title="m.unlock_and_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_shared</span><span class="special">()</span></code></a>
2541</h5></div></div></div>
2542<div class="variablelist">
2543<p class="title"><b></b></p>
2544<dl class="variablelist">
2545<dt><span class="term">Precondition:</span></dt>
2546<dd><p>
2547                  The calling thread shall hold an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
2548                </p></dd>
2549<dt><span class="term">Effects:</span></dt>
2550<dd><p>
2551                  Atomically converts the ownership from exclusive to shared for
2552                  the calling thread.
2553                </p></dd>
2554<dt><span class="term">Postcondition:</span></dt>
2555<dd><p>
2556                  The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2557                </p></dd>
2558<dt><span class="term">Synchronization:</span></dt>
2559<dd><p>
2560                  This operation synchronizes with subsequent lock operations that
2561                  obtain ownership of the same object.
2562                </p></dd>
2563<dt><span class="term">Throws:</span></dt>
2564<dd><p>
2565                  Nothing
2566                </p></dd>
2567</dl>
2568</div>
2569</div>
2570<div class="section">
2571<div class="titlepage"><div><div><h5 class="title">
2572<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">()</span></code></a>
2573</h5></div></div></div>
2574<div class="variablelist">
2575<p class="title"><b></b></p>
2576<dl class="variablelist">
2577<dt><span class="term">Precondition:</span></dt>
2578<dd><p>
2579                  The calling thread shall hold a shared lock on the mutex.
2580                </p></dd>
2581<dt><span class="term">Effects:</span></dt>
2582<dd><p>
2583                  The function attempts to atomically convert the ownership from
2584                  shared to upgrade for the calling thread without blocking. For
2585                  this conversion to be successful, there must be no thread holding
2586                  upgrade ownership of this object. If the conversion is not successful,
2587                  the shared ownership of the mutex is retained.
2588                </p></dd>
2589<dt><span class="term">Returns:</span></dt>
2590<dd><p>
2591                  <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2592                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2593                  otherwise.
2594                </p></dd>
2595<dt><span class="term">Postcondition:</span></dt>
2596<dd><p>
2597                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2598                  the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2599                </p></dd>
2600<dt><span class="term">Synchronization:</span></dt>
2601<dd><p>
2602                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations
2603                  on the same object synchronize with this operation.
2604                </p></dd>
2605<dt><span class="term">Throws:</span></dt>
2606<dd><p>
2607                  Nothing
2608                </p></dd>
2609<dt><span class="term">Notes:</span></dt>
2610<dd><p>
2611                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
2612                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2613                  is defined on Windows platform
2614                </p></dd>
2615</dl>
2616</div>
2617</div>
2618<div class="section">
2619<div class="titlepage"><div><div><h5 class="title">
2620<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
2621</h5></div></div></div>
2622<div class="variablelist">
2623<p class="title"><b></b></p>
2624<dl class="variablelist">
2625<dt><span class="term">Precondition:</span></dt>
2626<dd><p>
2627                  The calling thread shall hold a shared lock on the mutex.
2628                </p></dd>
2629<dt><span class="term">Effects:</span></dt>
2630<dd><p>
2631                  If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2632                  is not exactly convertible to the native tick period, the duration
2633                  shall be rounded up to the nearest native tick period. The function
2634                  attempts to atomically convert the ownership from shared to upgrade
2635                  for the calling thread within the relative timeout specified by
2636                  <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2637                  time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2638                  is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain
2639                  upgrade ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code>). The function shall return within
2640                  the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2641                  only if it has obtained exclusive ownership of the mutex object.
2642                  For this conversion to be successful, there must be no thread holding
2643                  upgrade ownership of this object at the moment of conversion. If
2644                  the conversion is not successful, the shared ownership of m is
2645                  retained.
2646                </p></dd>
2647<dt><span class="term">Returns:</span></dt>
2648<dd><p>
2649                  <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2650                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2651                  otherwise.
2652                </p></dd>
2653<dt><span class="term">Postcondition:</span></dt>
2654<dd><p>
2655                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2656                  the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2657                </p></dd>
2658<dt><span class="term">Synchronization:</span></dt>
2659<dd><p>
2660                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_for" title="m.try_unlock_shared_and_lock_upgrade_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations
2661                  on the same object synchronize with this operation.
2662                </p></dd>
2663<dt><span class="term">Throws:</span></dt>
2664<dd><p>
2665                  Nothing
2666                </p></dd>
2667<dt><span class="term">Notes:</span></dt>
2668<dd><p>
2669                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
2670                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2671                  is defined on Windows platform
2672                </p></dd>
2673</dl>
2674</div>
2675</div>
2676<div class="section">
2677<div class="titlepage"><div><div><h5 class="title">
2678<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
2679</h5></div></div></div>
2680<div class="variablelist">
2681<p class="title"><b></b></p>
2682<dl class="variablelist">
2683<dt><span class="term">Precondition:</span></dt>
2684<dd><p>
2685                  The calling thread shall hold a shared lock on the mutex.
2686                </p></dd>
2687<dt><span class="term">Effects:</span></dt>
2688<dd><p>
2689                  The function attempts to atomically convert the ownership from
2690                  shared to upgrade for the calling thread within the absolute timeout
2691                  specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2692                  If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2693                  already passed, the function attempts to obtain upgrade ownership
2694                  without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade" title="m.try_unlock_shared_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade</span></code></a><span class="special">()</span></code>). The function shall return before
2695                  the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2696                  only if it has obtained upgrade ownership of the mutex object.
2697                  For this conversion to be successful, there must be no thread holding
2698                  upgrade ownership of this object at the moment of conversion. If
2699                  the conversion is not successful, the shared ownership of the mutex
2700                  is retained.
2701                </p></dd>
2702<dt><span class="term">Returns:</span></dt>
2703<dd><p>
2704                  <code class="computeroutput"><span class="keyword">true</span></code> if upgrade ownership
2705                  was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2706                  otherwise.
2707                </p></dd>
2708<dt><span class="term">Postcondition:</span></dt>
2709<dd><p>
2710                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2711                  the current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2712                </p></dd>
2713<dt><span class="term">Synchronization:</span></dt>
2714<dd><p>
2715                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_upgrade_until" title="m.try_unlock_shared_and_lock_upgrade_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_upgrade_until</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">unlock_upgrade</span></code></a><span class="special">()</span></code> and subsequent lock operations
2716                  on the same object synchronize with this operation.
2717                </p></dd>
2718<dt><span class="term">Throws:</span></dt>
2719<dd><p>
2720                  Nothing
2721                </p></dd>
2722<dt><span class="term">Notes:</span></dt>
2723<dd><p>
2724                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
2725                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2726                  is defined on Windows platform
2727                </p></dd>
2728</dl>
2729</div>
2730</div>
2731<div class="section">
2732<div class="titlepage"><div><div><h5 class="title">
2733<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_and_lock_upgrade" title="m.unlock_and_lock_upgrade()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_and_lock_upgrade</span><span class="special">()</span></code></a>
2734</h5></div></div></div>
2735<div class="variablelist">
2736<p class="title"><b></b></p>
2737<dl class="variablelist">
2738<dt><span class="term">Precondition:</span></dt>
2739<dd><p>
2740                  The current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2741                </p></dd>
2742<dt><span class="term">Effects:</span></dt>
2743<dd><p>
2744                  Atomically releases exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2745                  by the current thread and acquires upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code> without blocking.
2746                </p></dd>
2747<dt><span class="term">Postcondition:</span></dt>
2748<dd><p>
2749                  The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2750                </p></dd>
2751<dt><span class="term">Synchronization:</span></dt>
2752<dd><p>
2753                  This operation synchronizes with subsequent lock operations that
2754                  obtain ownership of the same object.
2755                </p></dd>
2756<dt><span class="term">Throws:</span></dt>
2757<dd><p>
2758                  Nothing
2759                </p></dd>
2760</dl>
2761</div>
2762</div>
2763<div class="section">
2764<div class="titlepage"><div><div><h5 class="title">
2765<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock" title="m.unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock</span><span class="special">()</span></code></a>
2766</h5></div></div></div>
2767<div class="variablelist">
2768<p class="title"><b></b></p>
2769<dl class="variablelist">
2770<dt><span class="term">Precondition:</span></dt>
2771<dd><p>
2772                  The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2773                </p></dd>
2774<dt><span class="term">Effects:</span></dt>
2775<dd><p>
2776                  Atomically releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2777                  by the current thread and acquires exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>. If any other threads have
2778                  shared ownership, blocks until exclusive ownership can be acquired.
2779                </p></dd>
2780<dt><span class="term">Postcondition:</span></dt>
2781<dd><p>
2782                  The current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2783                </p></dd>
2784<dt><span class="term">Synchronization:</span></dt>
2785<dd><p>
2786                  This operation synchronizes with prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code> and subsequent lock operations
2787                  that obtain ownership of the same object.
2788                </p></dd>
2789<dt><span class="term">Throws:</span></dt>
2790<dd><p>
2791                  Nothing
2792                </p></dd>
2793</dl>
2794</div>
2795</div>
2796<div class="section">
2797<div class="titlepage"><div><div><h5 class="title">
2798<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">()</span></code></a>
2799</h5></div></div></div>
2800<div class="variablelist">
2801<p class="title"><b></b></p>
2802<dl class="variablelist">
2803<dt><span class="term">Precondition:</span></dt>
2804<dd><p>
2805                  The calling thread shall hold an upgrade lock on the mutex.
2806                </p></dd>
2807<dt><span class="term">Effects:</span></dt>
2808<dd><p>
2809                  The function attempts to atomically convert the ownership from
2810                  upgrade to exclusive for the calling thread without blocking. For
2811                  this conversion to be successful, this thread must be the only
2812                  thread holding any ownership of the lock. If the conversion is
2813                  not successful, the upgrade ownership of m is retained.
2814                </p></dd>
2815<dt><span class="term">Returns:</span></dt>
2816<dd><p>
2817                  <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2818                  ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2819                  otherwise.
2820                </p></dd>
2821<dt><span class="term">Postcondition:</span></dt>
2822<dd><p>
2823                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2824                  the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2825                </p></dd>
2826<dt><span class="term">Synchronization:</span></dt>
2827<dd><p>
2828                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2829                  and subsequent lock operations on the same object synchronize with
2830                  this operation.
2831                </p></dd>
2832<dt><span class="term">Throws:</span></dt>
2833<dd><p>
2834                  Nothing
2835                </p></dd>
2836<dt><span class="term">Notes:</span></dt>
2837<dd><p>
2838                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2839                  is defined on Windows platform
2840                </p></dd>
2841</dl>
2842</div>
2843</div>
2844<div class="section">
2845<div class="titlepage"><div><div><h5 class="title">
2846<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code></a>
2847</h5></div></div></div>
2848<div class="variablelist">
2849<p class="title"><b></b></p>
2850<dl class="variablelist">
2851<dt><span class="term">Precondition:</span></dt>
2852<dd><p>
2853                  The calling thread shall hold an upgrade lock on the mutex.
2854                </p></dd>
2855<dt><span class="term">Effects:</span></dt>
2856<dd><p>
2857                  If the tick period of <code class="computeroutput"><span class="identifier">rel_time</span></code>
2858                  is not exactly convertible to the native tick period, the duration
2859                  shall be rounded up to the nearest native tick period. The function
2860                  attempts to atomically convert the ownership from upgrade to exclusive
2861                  for the calling thread within the relative timeout specified by
2862                  <code class="computeroutput"><span class="identifier">rel_time</span></code>. If the
2863                  time specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2864                  is less than or equal to <code class="computeroutput"><span class="identifier">rel_time</span><span class="special">.</span><span class="identifier">zero</span><span class="special">()</span></code>, the function attempts to obtain
2865                  exclusive ownership without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code>). The function shall return within
2866                  the timeout specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
2867                  only if it has obtained exclusive ownership of the mutex object.
2868                  For this conversion to be successful, this thread shall be the
2869                  only thread holding any ownership of the lock at the moment of
2870                  conversion. If the conversion is not successful, the upgrade ownership
2871                  of m is retained.
2872                </p></dd>
2873<dt><span class="term">Returns:</span></dt>
2874<dd><p>
2875                  <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2876                  ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2877                  otherwise.
2878                </p></dd>
2879<dt><span class="term">Postcondition:</span></dt>
2880<dd><p>
2881                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2882                  the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2883                </p></dd>
2884<dt><span class="term">Synchronization:</span></dt>
2885<dd><p>
2886                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2887                  and subsequent lock operations on the same object synchronize with
2888                  this operation.
2889                </p></dd>
2890<dt><span class="term">Throws:</span></dt>
2891<dd><p>
2892                  Nothing
2893                </p></dd>
2894<dt><span class="term">Notes:</span></dt>
2895<dd><p>
2896                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2897                  is defined on Windows platform
2898                </p></dd>
2899</dl>
2900</div>
2901</div>
2902<div class="section">
2903<div class="titlepage"><div><div><h5 class="title">
2904<a name="thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_until" title="m.try_unlock_upgrade_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
2905</h5></div></div></div>
2906<div class="variablelist">
2907<p class="title"><b></b></p>
2908<dl class="variablelist">
2909<dt><span class="term">Precondition:</span></dt>
2910<dd><p>
2911                  The calling thread shall hold an upgrade lock on the mutex.
2912                </p></dd>
2913<dt><span class="term">Effects:</span></dt>
2914<dd><p>
2915                  The function attempts to atomically convert the ownership from
2916                  upgrade to exclusive for the calling thread within the absolute
2917                  timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>.
2918                  If <code class="computeroutput"><span class="identifier">abs_time</span></code> has
2919                  already passed, the function attempts to obtain exclusive ownership
2920                  without blocking (as if by calling <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock" title="m.try_unlock_upgrade_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock</span></code></a><span class="special">()</span></code>). The function shall return before
2921                  the absolute timeout specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
2922                  only if it has obtained exclusive ownership of the mutex object.
2923                  For this conversion to be successful, this thread shall be the
2924                  only thread holding any ownership of the lock at the moment of
2925                  conversion. If the conversion is not successful, the upgrade ownership
2926                  of m is retained.
2927                </p></dd>
2928<dt><span class="term">Returns:</span></dt>
2929<dd><p>
2930                  <code class="computeroutput"><span class="keyword">true</span></code> if exclusive
2931                  ownership was acquired for the current thread, <code class="computeroutput"><span class="keyword">false</span></code>
2932                  otherwise.
2933                </p></dd>
2934<dt><span class="term">Postcondition:</span></dt>
2935<dd><p>
2936                  If the call returns <code class="computeroutput"><span class="keyword">true</span></code>,
2937                  the current thread has exclusive ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2938                </p></dd>
2939<dt><span class="term">Synchronization:</span></dt>
2940<dd><p>
2941                  If <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_upgrade_and_lock_for" title="m.try_unlock_upgrade_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_upgrade_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns true, prior <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
2942                  and subsequent lock operations on the same object synchronize with
2943                  this operation.
2944                </p></dd>
2945<dt><span class="term">Throws:</span></dt>
2946<dd><p>
2947                  Nothing
2948                </p></dd>
2949<dt><span class="term">Notes:</span></dt>
2950<dd><p>
2951                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
2952                  is defined on Windows platform
2953                </p></dd>
2954</dl>
2955</div>
2956</div>
2957<div class="section">
2958<div class="titlepage"><div><div><h5 class="title">
2959<a name="thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade_and_lock_shared" title="m.unlock_upgrade_and_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">()</span></code></a>
2960</h5></div></div></div>
2961<div class="variablelist">
2962<p class="title"><b></b></p>
2963<dl class="variablelist">
2964<dt><span class="term">Precondition:</span></dt>
2965<dd><p>
2966                  The current thread has upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2967                </p></dd>
2968<dt><span class="term">Effects:</span></dt>
2969<dd><p>
2970                  Atomically releases upgrade ownership of <code class="computeroutput"><span class="identifier">m</span></code>
2971                  by the current thread and acquires shared ownership of <code class="computeroutput"><span class="identifier">m</span></code> without blocking.
2972                </p></dd>
2973<dt><span class="term">Postcondition:</span></dt>
2974<dd><p>
2975                  The current thread has shared ownership of <code class="computeroutput"><span class="identifier">m</span></code>.
2976                </p></dd>
2977<dt><span class="term">Synchronization:</span></dt>
2978<dd><p>
2979                  This operation synchronizes with prior <code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code> and subsequent lock operations
2980                  that obtain ownership of the same object.
2981                </p></dd>
2982<dt><span class="term">Throws:</span></dt>
2983<dd><p>
2984                  Nothing
2985                </p></dd>
2986</dl>
2987</div>
2988</div>
2989</div>
2990</div>
2991<div class="section">
2992<div class="titlepage"><div><div><h3 class="title">
2993<a name="thread.synchronization.lock_option"></a><a class="link" href="synchronization.html#thread.synchronization.lock_option" title="Lock Options">Lock Options</a>
2994</h3></div></div></div>
2995<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_option.lock_tags">Lock
2996        option tags</a></span></dt></dl></div>
2997<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt; </span>
2998<span class="comment">// #include &lt;boost/thread/locks_options.hpp&gt; </span>
2999
3000<span class="keyword">namespace</span> <span class="identifier">boost</span>
3001<span class="special">{</span>
3002  <span class="keyword">struct</span> <span class="identifier">defer_lock_t</span> <span class="special">{};</span>
3003  <span class="keyword">struct</span> <span class="identifier">try_to_lock_t</span> <span class="special">{};</span>
3004  <span class="keyword">struct</span> <span class="identifier">adopt_lock_t</span> <span class="special">{};</span>
3005  <span class="keyword">constexpr</span> <span class="identifier">defer_lock_t</span> <span class="identifier">defer_lock</span><span class="special">;</span>
3006  <span class="keyword">constexpr</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">try_to_lock</span><span class="special">;</span>
3007  <span class="keyword">constexpr</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">adopt_lock</span><span class="special">;</span>
3008</pre>
3009<div class="section">
3010<div class="titlepage"><div><div><h4 class="title">
3011<a name="thread.synchronization.lock_option.lock_tags"></a><a class="link" href="synchronization.html#thread.synchronization.lock_option.lock_tags" title="Lock option tags">Lock
3012        option tags</a>
3013</h4></div></div></div>
3014<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
3015<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>
3016
3017<span class="keyword">struct</span> <span class="identifier">defer_lock_t</span> <span class="special">{};</span>
3018<span class="keyword">struct</span> <span class="identifier">try_to_lock_t</span> <span class="special">{};</span>
3019<span class="keyword">struct</span> <span class="identifier">adopt_lock_t</span> <span class="special">{};</span>
3020<span class="keyword">const</span> <span class="identifier">defer_lock_t</span> <span class="identifier">defer_lock</span><span class="special">;</span>
3021<span class="keyword">const</span> <span class="identifier">try_to_lock_t</span> <span class="identifier">try_to_lock</span><span class="special">;</span>
3022<span class="keyword">const</span> <span class="identifier">adopt_lock_t</span> <span class="identifier">adopt_lock</span><span class="special">;</span>
3023</pre>
3024<p>
3025          These tags are used in scoped locks constructors to specify a specific
3026          behavior.
3027        </p>
3028<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3029<li class="listitem">
3030              <code class="computeroutput"><span class="identifier">defer_lock_t</span></code>: is used
3031              to construct the scoped lock without locking it.
3032            </li>
3033<li class="listitem">
3034              <code class="computeroutput"><span class="identifier">try_to_lock_t</span></code>: is used
3035              to construct the scoped lock trying to lock it.
3036            </li>
3037<li class="listitem">
3038              <code class="computeroutput"><span class="identifier">adopt_lock_t</span></code>: is used
3039              to construct the scoped lock without locking it but adopting ownership.
3040            </li>
3041</ul></div>
3042</div>
3043</div>
3044<div class="section">
3045<div class="titlepage"><div><div><h3 class="title">
3046<a name="thread.synchronization.lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard" title="Lock Guard">Lock Guard</a>
3047</h3></div></div></div>
3048<div class="toc"><dl class="toc">
3049<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard">Class
3050        template <code class="computeroutput"><span class="identifier">lock_guard</span></code></a></span></dt>
3051<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard">Non
3052        Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a></span></dt>
3053<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard_adopt">Non
3054        Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a></span></dt>
3055</dl></div>
3056<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt; </span>
3057<span class="comment">// #include &lt;boost/thread/lock_guard.hpp&gt; </span>
3058
3059<span class="keyword">namespace</span> <span class="identifier">boost</span>
3060<span class="special">{</span>
3061
3062  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3063  <span class="keyword">class</span> <span class="identifier">lock_guard</span>
3064<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_LOCK_GUARD</span>
3065  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3066  <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>
3067  <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>
3068  <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>
3069<span class="preprocessor">#endif</span>
3070<span class="special">}</span>
3071</pre>
3072<div class="section">
3073<div class="titlepage"><div><div><h4 class="title">
3074<a name="thread.synchronization.lock_guard.lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard">Class
3075        template <code class="computeroutput"><span class="identifier">lock_guard</span></code></a>
3076</h4></div></div></div>
3077<div class="toc"><dl class="toc">
3078<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3079          <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
3080<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt"><code class="computeroutput"><span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3081          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt>
3082<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_guard.lock_guard.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">lock_guard</span><span class="special">()</span></code></a></span></dt>
3083</dl></div>
3084<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
3085<span class="comment">// #include &lt;boost/thread/lock_guard.hpp&gt; </span>
3086
3087<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>
3088<span class="keyword">class</span> <span class="identifier">lock_guard</span>
3089<span class="special">{</span>
3090<span class="keyword">public</span><span class="special">:</span>
3091    <span class="keyword">explicit</span> <span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
3092    <span class="identifier">lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&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>
3093
3094    <span class="special">~</span><span class="identifier">lock_guard</span><span class="special">();</span>
3095<span class="special">};</span>
3096</pre>
3097<p>
3098          <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a> is very simple: on
3099          construction it acquires ownership of the implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> supplied as the
3100          constructor parameter. On destruction, the ownership is released. This
3101          provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, to facilitate
3102          exception-safe locking and unlocking. In addition, the <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt" title="lock_guard(Lockable &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>
3103          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code>
3104          constructor</a> allows the <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a> object to take ownership
3105          of a lock already held by the current thread.
3106        </p>
3107<div class="section">
3108<div class="titlepage"><div><div><h5 class="title">
3109<a name="thread.synchronization.lock_guard.lock_guard.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor" title="lock_guard(Lockable &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>
3110          <span class="identifier">m</span><span class="special">)</span></code></a>
3111</h5></div></div></div>
3112<div class="variablelist">
3113<p class="title"><b></b></p>
3114<dl class="variablelist">
3115<dt><span class="term">Effects:</span></dt>
3116<dd><p>
3117                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3118                  Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3119                </p></dd>
3120<dt><span class="term">Throws:</span></dt>
3121<dd><p>
3122                  Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3123                </p></dd>
3124</dl>
3125</div>
3126</div>
3127<div class="section">
3128<div class="titlepage"><div><div><h5 class="title">
3129<a name="thread.synchronization.lock_guard.lock_guard.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.constructor_adopt" title="lock_guard(Lockable &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>
3130          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
3131</h5></div></div></div>
3132<div class="variablelist">
3133<p class="title"><b></b></p>
3134<dl class="variablelist">
3135<dt><span class="term">Precondition:</span></dt>
3136<dd><p>
3137                  The current thread owns a lock on <code class="computeroutput"><span class="identifier">m</span></code>
3138                  equivalent to one obtained by a call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3139                </p></dd>
3140<dt><span class="term">Effects:</span></dt>
3141<dd><p>
3142                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3143                  Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
3144                </p></dd>
3145<dt><span class="term">Throws:</span></dt>
3146<dd><p>
3147                  Nothing.
3148                </p></dd>
3149</dl>
3150</div>
3151</div>
3152<div class="section">
3153<div class="titlepage"><div><div><h5 class="title">
3154<a name="thread.synchronization.lock_guard.lock_guard.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard.destructor" title="~lock_guard()"><code class="computeroutput"><span class="special">~</span><span class="identifier">lock_guard</span><span class="special">()</span></code></a>
3155</h5></div></div></div>
3156<div class="variablelist">
3157<p class="title"><b></b></p>
3158<dl class="variablelist">
3159<dt><span class="term">Effects:</span></dt>
3160<dd><p>
3161                  Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a>
3162                  on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed
3163                  to the constructor.
3164                </p></dd>
3165<dt><span class="term">Throws:</span></dt>
3166<dd><p>
3167                  Nothing.
3168                </p></dd>
3169</dl>
3170</div>
3171</div>
3172</div>
3173<div class="section">
3174<div class="titlepage"><div><div><h4 class="title">
3175<a name="thread.synchronization.lock_guard.make_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard" title="Non Member Function make_lock_guard">Non
3176        Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a>
3177</h4></div></div></div>
3178<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3179<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>
3180</pre>
3181<div class="variablelist">
3182<p class="title"><b></b></p>
3183<dl class="variablelist">
3184<dt><span class="term">Returns:</span></dt>
3185<dd><p>
3186                a lock_guard as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">}</span></code>.
3187              </p></dd>
3188<dt><span class="term">Throws:</span></dt>
3189<dd><p>
3190                Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3191              </p></dd>
3192</dl>
3193</div>
3194</div>
3195<div class="section">
3196<div class="titlepage"><div><div><h4 class="title">
3197<a name="thread.synchronization.lock_guard.make_lock_guard_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.lock_guard.make_lock_guard_adopt" title="Non Member Function make_lock_guard">Non
3198        Member Function <code class="computeroutput"><span class="identifier">make_lock_guard</span></code></a>
3199</h4></div></div></div>
3200<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3201<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>
3202</pre>
3203<div class="variablelist">
3204<p class="title"><b></b></p>
3205<dl class="variablelist">
3206<dt><span class="term">Returns:</span></dt>
3207<dd><p>
3208                a lock_guard as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock</span><span class="special">}</span></code>.
3209              </p></dd>
3210<dt><span class="term">Throws:</span></dt>
3211<dd><p>
3212                Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3213              </p></dd>
3214</dl>
3215</div>
3216</div>
3217</div>
3218<div class="section">
3219<div class="titlepage"><div><div><h3 class="title">
3220<a name="thread.synchronization.with_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.with_lock_guard" title="With Lock Guard">With Lock Guard</a>
3221</h3></div></div></div>
3222<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.with_lock_guard.with_lock_guard">Non
3223        Member Function <code class="computeroutput"><span class="identifier">with_lock_guard</span></code></a></span></dt></dl></div>
3224<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/with_lock_guard.hpp&gt;</span>
3225
3226<span class="keyword">namespace</span> <span class="identifier">boost</span>
3227<span class="special">{</span>
3228  <span class="keyword">template</span> <span class="special">&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>
3229  <span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&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>
3230<span class="special">}</span>
3231</pre>
3232<div class="section">
3233<div class="titlepage"><div><div><h4 class="title">
3234<a name="thread.synchronization.with_lock_guard.with_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.with_lock_guard.with_lock_guard" title="Non Member Function with_lock_guard">Non
3235        Member Function <code class="computeroutput"><span class="identifier">with_lock_guard</span></code></a>
3236</h4></div></div></div>
3237<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
3238<span class="keyword">auto</span> <span class="identifier">with_lock_guard</span><span class="special">(</span>
3239    <span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span>
3240    <span class="identifier">Function</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">,</span>
3241    <span class="identifier">Args</span><span class="special">&amp;&amp;...</span> <span class="identifier">args</span>
3242<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>
3243</pre>
3244<div class="variablelist">
3245<p class="title"><b></b></p>
3246<dl class="variablelist">
3247<dt><span class="term">Precondition:</span></dt>
3248<dd><p>
3249                <code class="computeroutput"><span class="identifier">m</span></code> must be in unlocked
3250                state
3251              </p></dd>
3252<dt><span class="term">Effects:</span></dt>
3253<dd><p>
3254                call <code class="computeroutput"><span class="identifier">func</span></code> in scope
3255                locked by <code class="computeroutput"><span class="identifier">m</span></code>
3256              </p></dd>
3257<dt><span class="term">Returns:</span></dt>
3258<dd><p>
3259                Result of <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">args</span><span class="special">...)</span></code>
3260                call
3261              </p></dd>
3262<dt><span class="term">Throws:</span></dt>
3263<dd><p>
3264                Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span></code>
3265                and <code class="computeroutput"><span class="identifier">func</span><span class="special">(</span><span class="identifier">args</span><span class="special">...)</span></code>
3266              </p></dd>
3267<dt><span class="term">Postcondition:</span></dt>
3268<dd><p>
3269                <code class="computeroutput"><span class="identifier">m</span></code> is in unlocked
3270                state
3271              </p></dd>
3272<dt><span class="term">Limitations:</span></dt>
3273<dd><p>
3274                Without c++11 variadic templates support number of arguments is limited
3275                to <code class="computeroutput"><span class="number">4</span></code>
3276              </p></dd>
3277<dt><span class="term"></span></dt>
3278<dd><p>
3279                Without rvalue references support calling class method with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code> must be const
3280              </p></dd>
3281<dt><span class="term"></span></dt>
3282<dd><p>
3283                For correct work with lambda macro <code class="computeroutput"><span class="identifier">BOOST_RESULT_OF_USE_DECLTYPE</span></code>
3284                may be needed to define
3285              </p></dd>
3286</dl>
3287</div>
3288</div>
3289</div>
3290<div class="section">
3291<div class="titlepage"><div><div><h3 class="title">
3292<a name="thread.synchronization.lock_concepts"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts" title="Lock Concepts">Lock Concepts</a>
3293</h3></div></div></div>
3294<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock">StrictLock
3295        -- EXTENSION</a></span></dt></dl></div>
3296<div class="section">
3297<div class="titlepage"><div><div><h4 class="title">
3298<a name="thread.synchronization.lock_concepts.StrictLock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION">StrictLock
3299        -- EXTENSION</a>
3300</h4></div></div></div>
3301<div class="toc"><dl class="toc">
3302<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.mutex_type"><code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code></a></span></dt>
3303<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole"><code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">&gt;</span></code></a></span></dt>
3304<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.owns_lock"><code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code></a></span></dt>
3305<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.models">Models</a></span></dt>
3306</dl></div>
3307<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/lock_concepts.hpp&gt; </span>
3308
3309<span class="keyword">namespace</span> <span class="identifier">boost</span>
3310<span class="special">{</span>
3311
3312  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
3313  <span class="keyword">class</span> <span class="identifier">StrictLock</span><span class="special">;</span>
3314<span class="special">}</span>
3315</pre>
3316<p>
3317          A StrictLock is a lock that ensures that the associated mutex is locked
3318          during the lifetime of the lock.
3319        </p>
3320<p>
3321          A type <code class="computeroutput"><span class="identifier">L</span></code> meets the StrictLock
3322          requirements if the following expressions are well-formed and have the
3323          specified semantics
3324        </p>
3325<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3326<li class="listitem">
3327              <code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code>
3328            </li>
3329<li class="listitem">
3330              <code class="computeroutput"><span class="identifier">is_strict_lock</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">&gt;</span></code>
3331            </li>
3332<li class="listitem">
3333              <code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code>
3334            </li>
3335</ul></div>
3336<p>
3337          and BasicLockable&lt;L::mutex_type&gt;
3338        </p>
3339<p>
3340          where
3341        </p>
3342<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3343<li class="listitem">
3344              <code class="computeroutput"><span class="identifier">cl</span></code> denotes a value
3345              of type <code class="computeroutput"><span class="identifier">L</span> <span class="keyword">const</span><span class="special">&amp;</span></code>,
3346            </li>
3347<li class="listitem">
3348              <code class="computeroutput"><span class="identifier">m</span></code> denotes a value of
3349              type <code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span></code>,
3350            </li>
3351</ul></div>
3352<div class="section">
3353<div class="titlepage"><div><div><h5 class="title">
3354<a name="thread.synchronization.lock_concepts.StrictLock.mutex_type"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.mutex_type" title="L::mutex_type"><code class="computeroutput"><span class="identifier">L</span><span class="special">::</span><span class="identifier">mutex_type</span></code></a>
3355</h5></div></div></div>
3356<p>
3357            The type L::mutex_type denotes the mutex that is locked by this lock.
3358          </p>
3359</div>
3360<div class="section">
3361<div class="titlepage"><div><div><h5 class="title">
3362<a name="thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.is_strict_lock_sur_parole" title="is_strict_lock_sur_parole&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>
3363</h5></div></div></div>
3364<p>
3365            As the semantic "ensures that the associated mutex is locked during
3366            the lifetime of the lock. " can not be described by syntactic requirements
3367            a <code class="computeroutput"><span class="identifier">is_strict_lock_sur_parole</span></code>
3368            trait must be specialized by the user defining the lock so that the following
3369            assertion is true:
3370          </p>
3371<pre class="programlisting"><span class="identifier">is_strict_lock_sur_parole</span><span class="special">&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>
3372</pre>
3373</div>
3374<div class="section">
3375<div class="titlepage"><div><div><h5 class="title">
3376<a name="thread.synchronization.lock_concepts.StrictLock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.owns_lock" title="cl.owns_lock(m);"><code class="computeroutput"><span class="identifier">cl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span></code></a>
3377</h5></div></div></div>
3378<div class="variablelist">
3379<p class="title"><b></b></p>
3380<dl class="variablelist">
3381<dt><span class="term">Return Type:</span></dt>
3382<dd><p>
3383                  <code class="computeroutput"><span class="keyword">bool</span></code>
3384                </p></dd>
3385<dt><span class="term">Returns:</span></dt>
3386<dd><p>
3387                  Whether the strict lock is locking the mutex <code class="computeroutput"><span class="identifier">m</span></code>
3388                </p></dd>
3389<dt><span class="term">Throws:</span></dt>
3390<dd><p>
3391                  Nothing.
3392                </p></dd>
3393</dl>
3394</div>
3395</div>
3396<div class="section">
3397<div class="titlepage"><div><div><h5 class="title">
3398<a name="thread.synchronization.lock_concepts.StrictLock.models"></a><a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock.models" title="Models">Models</a>
3399</h5></div></div></div>
3400<p>
3401            The following classes are models of <code class="computeroutput"><span class="identifier">StrictLock</span></code>:
3402          </p>
3403<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
3404<li class="listitem">
3405                strict_lock: ensured by construction,
3406              </li>
3407<li class="listitem">
3408                nested_strict_lock: "sur parole" as the user could use
3409                adopt_lock_t on unique_lock constructor overload without having locked
3410                the mutex,
3411              </li>
3412<li class="listitem">
3413                <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>: "sur parole"
3414                as the user could use adopt_lock_t constructor overload without having
3415                locked the mutex.
3416              </li>
3417</ul></div>
3418</div>
3419</div>
3420</div>
3421<div class="section">
3422<div class="titlepage"><div><div><h3 class="title">
3423<a name="thread.synchronization.locks"></a><a class="link" href="synchronization.html#thread.synchronization.locks" title="Lock Types">Lock Types</a>
3424</h3></div></div></div>
3425<div class="toc"><dl class="toc">
3426<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock">Class template
3427        <code class="computeroutput"><span class="identifier">unique_lock</span></code></a></span></dt>
3428<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock">Class template
3429        <code class="computeroutput"><span class="identifier">shared_lock</span></code> - C++14</a></span></dt>
3430<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.upgrade_lock">Class template
3431        <code class="computeroutput"><span class="identifier">upgrade_lock</span></code> - EXTENSION</a></span></dt>
3432<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock">Class
3433        template <code class="computeroutput"><span class="identifier">upgrade_to_unique_lock</span></code>
3434        -- EXTENSION</a></span></dt>
3435<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.scoped_try_lock">Mutex-specific
3436        class <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> --
3437        DEPRECATED</a></span></dt>
3438</dl></div>
3439<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt; </span>
3440<span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
3441
3442<span class="keyword">namespace</span> <span class="identifier">boost</span>
3443<span class="special">{</span>
3444
3445  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
3446  <span class="keyword">class</span> <span class="identifier">unique_lock</span><span class="special">;</span>
3447  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">&gt;</span>
3448  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">unique_lock</span> <span class="special">&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>
3449  <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>
3450  <span class="keyword">class</span> <span class="identifier">shared_lock</span><span class="special">;</span> <span class="comment">// C++14</span>
3451  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">&gt;</span>
3452  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&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>
3453  <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>
3454  <span class="keyword">class</span> <span class="identifier">upgrade_lock</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
3455  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Mutex</span><span class="special">&gt;</span>
3456  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_lock</span> <span class="special">&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>
3457  <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>
3458  <span class="keyword">class</span> <span class="identifier">upgrade_to_unique_lock</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
3459<span class="special">}</span>
3460</pre>
3461<div class="section">
3462<div class="titlepage"><div><div><h4 class="title">
3463<a name="thread.synchronization.locks.unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock">Class template
3464        <code class="computeroutput"><span class="identifier">unique_lock</span></code></a>
3465</h4></div></div></div>
3466<div class="toc"><dl class="toc">
3467<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.defaultconstructor"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">()</span></code></a></span></dt>
3468<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3469          <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
3470<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_adopt"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3471          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt>
3472<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_defer"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3473          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a></span></dt>
3474<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_try"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3475          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt>
3476<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_try"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;</span>
3477          <span class="identifier">sl</span><span class="special">,</span>
3478          <span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt>
3479<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_until"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;,</span>
3480          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
3481<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_for"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">&gt;&amp;&amp;,</span>
3482          <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>
3483<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_abs_time"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3484          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
3485<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_time_point"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
3486          <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3487          <span class="identifier">m</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
3488<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_duration"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
3489          <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3490          <span class="identifier">m</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
3491<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">unique_lock</span><span class="special">()</span></code></a></span></dt>
3492<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt>
3493<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.mutex"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a></span></dt>
3494<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.explicit_bool_conversion"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
3495          <span class="keyword">bool</span><span class="special">()</span>
3496          <span class="keyword">const</span></code></a></span></dt>
3497<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.unique_lock.release"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a></span></dt>
3498</dl></div>
3499<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
3500<span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
3501
3502<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>
3503<span class="keyword">class</span> <span class="identifier">unique_lock</span>
3504<span class="special">{</span>
3505<span class="keyword">public</span><span class="special">:</span>
3506    <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
3507    <span class="identifier">unique_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
3508    <span class="keyword">explicit</span> <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
3509    <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
3510    <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&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>
3511    <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>
3512
3513<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span>
3514    <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&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>
3515    <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>
3516    <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>
3517                <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>
3518    <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>
3519    <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>
3520                <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>
3521<span class="preprocessor">#endif</span>
3522
3523    <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>
3524    <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>
3525    <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>
3526    <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>
3527    <span class="special">~</span><span class="identifier">unique_lock</span><span class="special">();</span>
3528
3529    <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">unique_lock</span> <span class="keyword">const</span><span class="special">&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">&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>
3531    <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>
3532    <span class="keyword">explicit</span> <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&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>
3533
3534    <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>
3535
3536    <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
3537    <span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
3538
3539    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
3540    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
3541
3542    <span class="keyword">template</span> <span class="special">&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>
3543    <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
3544    <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>
3545    <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
3546
3547    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
3548
3549    <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
3550    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
3551
3552    <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
3553
3554<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USE_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
3555    <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&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>
3556    <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>
3557    <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">relative_time</span><span class="special">);</span>
3558    <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">absolute_time</span><span class="special">);</span>
3559<span class="preprocessor">#endif</span>
3560
3561<span class="special">};</span>
3562</pre>
3563<p>
3564          <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is more complex than
3565          <a class="link" href="synchronization.html#thread.synchronization.lock_guard.lock_guard" title="Class template lock_guard"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>: not only does it provide
3566          for RAII-style locking, it also allows for deferring acquiring the lock
3567          until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
3568          member function is called explicitly, or trying to acquire the lock in
3569          a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
3570          is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise
3571          adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object.
3572        </p>
3573<p>
3574          Specializations of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> model the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> concept if the supplied
3575          <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3576          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code></a> concept (e.g. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span><span class="special">&gt;</span></code>),
3577          or the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> concept if the supplied
3578          <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3579          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> concept (e.g. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span></code>),
3580          or the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept if the supplied
3581          <code class="computeroutput"><span class="identifier">Lockable</span></code> type itself models
3582          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept.
3583        </p>
3584<p>
3585          An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span>
3586          the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code>
3587          if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3588          returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
3589          and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3590          returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
3591          that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed,
3592          then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-&gt;</span><span class="identifier">unlock</span><span class="special">()</span></code></a>.
3593        </p>
3594<p>
3595          The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> are not thread-safe.
3596          In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> is intended to model
3597          the ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object by a particular
3598          thread, and the member functions that release ownership of the lock state
3599          (including the destructor) must be called by the same thread that acquired
3600          ownership of the lock state.
3601        </p>
3602<div class="section">
3603<div class="titlepage"><div><div><h5 class="title">
3604<a name="thread.synchronization.locks.unique_lock.defaultconstructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.defaultconstructor" title="unique_lock()"><code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">()</span></code></a>
3605</h5></div></div></div>
3606<div class="variablelist">
3607<p class="title"><b></b></p>
3608<dl class="variablelist">
3609<dt><span class="term">Effects:</span></dt>
3610<dd><p>
3611                  Creates a lock object with no associated mutex.
3612                </p></dd>
3613<dt><span class="term">Postcondition:</span></dt>
3614<dd><p>
3615                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3616                  returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3617                  returns <code class="computeroutput"><span class="identifier">NULL</span></code>.
3618                </p></dd>
3619<dt><span class="term">Throws:</span></dt>
3620<dd><p>
3621                  Nothing.
3622                </p></dd>
3623</dl>
3624</div>
3625</div>
3626<div class="section">
3627<div class="titlepage"><div><div><h5 class="title">
3628<a name="thread.synchronization.locks.unique_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor" title="unique_lock(Lockable &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>
3629          <span class="identifier">m</span><span class="special">)</span></code></a>
3630</h5></div></div></div>
3631<div class="variablelist">
3632<p class="title"><b></b></p>
3633<dl class="variablelist">
3634<dt><span class="term">Effects:</span></dt>
3635<dd><p>
3636                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3637                  Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3638                </p></dd>
3639<dt><span class="term">Postcondition:</span></dt>
3640<dd><p>
3641                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3642                  returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3643                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3644                </p></dd>
3645<dt><span class="term">Throws:</span></dt>
3646<dd><p>
3647                  Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
3648                </p></dd>
3649</dl>
3650</div>
3651</div>
3652<div class="section">
3653<div class="titlepage"><div><div><h5 class="title">
3654<a name="thread.synchronization.locks.unique_lock.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_adopt" title="unique_lock(Lockable &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>
3655          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
3656</h5></div></div></div>
3657<div class="variablelist">
3658<p class="title"><b></b></p>
3659<dl class="variablelist">
3660<dt><span class="term">Precondition:</span></dt>
3661<dd><p>
3662                  The current thread owns an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
3663                </p></dd>
3664<dt><span class="term">Effects:</span></dt>
3665<dd><p>
3666                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3667                  Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
3668                </p></dd>
3669<dt><span class="term">Postcondition:</span></dt>
3670<dd><p>
3671                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3672                  returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3673                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3674                </p></dd>
3675<dt><span class="term">Throws:</span></dt>
3676<dd><p>
3677                  Nothing.
3678                </p></dd>
3679</dl>
3680</div>
3681</div>
3682<div class="section">
3683<div class="titlepage"><div><div><h5 class="title">
3684<a name="thread.synchronization.locks.unique_lock.constructor_defer"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_defer" title="unique_lock(Lockable &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>
3685          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a>
3686</h5></div></div></div>
3687<div class="variablelist">
3688<p class="title"><b></b></p>
3689<dl class="variablelist">
3690<dt><span class="term">Effects:</span></dt>
3691<dd><p>
3692                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3693                </p></dd>
3694<dt><span class="term">Postcondition:</span></dt>
3695<dd><p>
3696                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3697                  returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3698                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3699                </p></dd>
3700<dt><span class="term">Throws:</span></dt>
3701<dd><p>
3702                  Nothing.
3703                </p></dd>
3704</dl>
3705</div>
3706</div>
3707<div class="section">
3708<div class="titlepage"><div><div><h5 class="title">
3709<a name="thread.synchronization.locks.unique_lock.constructor_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_try" title="unique_lock(Lockable &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>
3710          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a>
3711</h5></div></div></div>
3712<div class="variablelist">
3713<p class="title"><b></b></p>
3714<dl class="variablelist">
3715<dt><span class="term">Effects:</span></dt>
3716<dd><p>
3717                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3718                  Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
3719                  and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3720                </p></dd>
3721<dt><span class="term">Postcondition:</span></dt>
3722<dd><p>
3723                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3724                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3725                  If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
3726                  returned <code class="computeroutput"><span class="keyword">true</span></code>, then
3727                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3728                  returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3729                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3730                  returns <code class="computeroutput"><span class="keyword">false</span></code>.
3731                </p></dd>
3732<dt><span class="term">Throws:</span></dt>
3733<dd><p>
3734                  Nothing.
3735                </p></dd>
3736</dl>
3737</div>
3738</div>
3739<div class="section">
3740<div class="titlepage"><div><div><h5 class="title">
3741<a name="thread.synchronization.locks.unique_lock.constructor_sh_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_try" title="unique_lock(shared_lock&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>
3742          <span class="identifier">sl</span><span class="special">,</span>
3743          <span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a>
3744</h5></div></div></div>
3745<div class="variablelist">
3746<p class="title"><b></b></p>
3747<dl class="variablelist">
3748<dt><span class="term">Requires:</span></dt>
3749<dd><p>
3750                  The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3751                  type must implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock" title="m.try_unlock_shared_and_lock()"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock</span></code></a><span class="special">()</span></code>.
3752                </p></dd>
3753<dt><span class="term">Effects:</span></dt>
3754<dd><p>
3755                  Constructs an object of type <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>. Let <code class="computeroutput"><span class="identifier">pm</span></code> be the pointer to the mutex
3756                  and <code class="computeroutput"><span class="identifier">owns</span></code> the ownership
3757                  state. Initializes <code class="computeroutput"><span class="identifier">pm</span></code>
3758                  with nullptr and <code class="computeroutput"><span class="identifier">owns</span></code>
3759                  with false. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3760                  sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3761                  return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3762                  and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&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>,
3763                  sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3764                  value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code>
3765                  to <code class="computeroutput"><span class="keyword">true</span></code>.
3766                </p></dd>
3767<dt><span class="term">Note:</span></dt>
3768<dd><p>
3769                  If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3770                  returns <code class="computeroutput"><span class="keyword">true</span></code> and
3771                  <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&gt;</span><span class="identifier">try_unlock_shared_and_lock</span><span class="special">()</span></code>
3772                  returns <code class="computeroutput"><span class="keyword">false</span></code>, <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3773                </p></dd>
3774<dt><span class="term">Throws:</span></dt>
3775<dd><p>
3776                  Nothing.
3777                </p></dd>
3778<dt><span class="term">Notes:</span></dt>
3779<dd><p>
3780                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
3781                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3782                  is defined on Windows platform
3783                </p></dd>
3784</dl>
3785</div>
3786</div>
3787<div class="section">
3788<div class="titlepage"><div><div><h5 class="title">
3789<a name="thread.synchronization.locks.unique_lock.constructor_sh_until"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_until" title="unique_lock(shared_lock&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>
3790          <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>
3791</h5></div></div></div>
3792<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>
3793<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>
3794            <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>
3795</pre>
3796<div class="variablelist">
3797<p class="title"><b></b></p>
3798<dl class="variablelist">
3799<dt><span class="term">Requires:</span></dt>
3800<dd><p>
3801                  The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3802                  type shall implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>.
3803                </p></dd>
3804<dt><span class="term">Effects:</span></dt>
3805<dd><p>
3806                  Constructs an object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a></code>, initializing
3807                  <code class="computeroutput"><span class="identifier">pm</span></code> with <code class="computeroutput"><span class="keyword">nullptr</span></code> and <code class="computeroutput"><span class="identifier">owns</span></code>
3808                  with <code class="computeroutput"><span class="keyword">false</span></code>. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span>
3809                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3810                  sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3811                  return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3812                  and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&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>,
3813                  sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3814                  value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code>
3815                  to <code class="computeroutput"><span class="keyword">true</span></code>.
3816                </p></dd>
3817<dt><span class="term">Note:</span></dt>
3818<dd><p>
3819                  If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3820                  returns <code class="computeroutput"><span class="keyword">true</span></code> and
3821                  <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&gt;</span>
3822                  <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_until" title="m.try_unlock_shared_and_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3823                  <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3824                </p></dd>
3825<dt><span class="term">Throws:</span></dt>
3826<dd><p>
3827                  Nothing.
3828                </p></dd>
3829<dt><span class="term">Notes:</span></dt>
3830<dd><p>
3831                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
3832                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3833                  is defined on Windows platform
3834                </p></dd>
3835</dl>
3836</div>
3837</div>
3838<div class="section">
3839<div class="titlepage"><div><div><h5 class="title">
3840<a name="thread.synchronization.locks.unique_lock.constructor_sh_for"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_sh_for" title="unique_lock(shared_lock&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>
3841          <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>
3842</h5></div></div></div>
3843<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>
3844<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>
3845            <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>
3846</pre>
3847<div class="variablelist">
3848<p class="title"><b></b></p>
3849<dl class="variablelist">
3850<dt><span class="term">Requires:</span></dt>
3851<dd><p>
3852                  The supplied <code class="computeroutput"><span class="identifier">Mutex</span></code>
3853                  type shall implement <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>.
3854                </p></dd>
3855<dt><span class="term">Effects:</span></dt>
3856<dd><p>
3857                  Constructs an object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a></code>, initializing
3858                  <code class="computeroutput"><span class="identifier">pm</span></code> with <code class="computeroutput"><span class="keyword">nullptr</span></code> and <code class="computeroutput"><span class="identifier">owns</span></code>
3859                  with <code class="computeroutput"><span class="keyword">false</span></code>. If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span>
3860                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3861                  sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3862                  return value of <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>. Else <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="keyword">true</span></code>,
3863                  and in this case if <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&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>,
3864                  sets <code class="computeroutput"><span class="identifier">pm</span></code> to the
3865                  value returned by <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code> and sets <code class="computeroutput"><span class="identifier">owns</span></code>
3866                  to <code class="computeroutput"><span class="keyword">true</span></code>.
3867                </p></dd>
3868<dt><span class="term">Note:</span></dt>
3869<dd><p>
3870                  If <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">owns_lock</span><span class="special">()</span></code>
3871                  returns <code class="computeroutput"><span class="keyword">true</span></code> and
3872                  <code class="computeroutput"><span class="identifier">sl</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()-&gt;</span>
3873                  <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.try_unlock_shared_and_lock_for" title="m.try_unlock_shared_and_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_unlock_shared_and_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code> returns <code class="computeroutput"><span class="keyword">false</span></code>,
3874                  <code class="computeroutput"><span class="identifier">sl</span></code> is not modified.
3875                </p></dd>
3876<dt><span class="term">Postcondition:</span></dt>
3877<dd><p>
3878                  .
3879                </p></dd>
3880<dt><span class="term">Throws:</span></dt>
3881<dd><p>
3882                  Nothing.
3883                </p></dd>
3884<dt><span class="term">Notes:</span></dt>
3885<dd><p>
3886                  Available only if <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span></code>
3887                  and <code class="computeroutput"><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span></code>
3888                  is defined on Windows platform
3889                </p></dd>
3890</dl>
3891</div>
3892</div>
3893<div class="section">
3894<div class="titlepage"><div><div><h5 class="title">
3895<a name="thread.synchronization.locks.unique_lock.constructor_abs_time"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_abs_time" title="unique_lock(Lockable &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>
3896          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
3897</h5></div></div></div>
3898<div class="variablelist">
3899<p class="title"><b></b></p>
3900<dl class="variablelist">
3901<dt><span class="term">Effects:</span></dt>
3902<dd><p>
3903                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3904                  Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>,
3905                  and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3906                </p></dd>
3907<dt><span class="term">Postcondition:</span></dt>
3908<dd><p>
3909                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3910                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3911                  If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
3912                  returned <code class="computeroutput"><span class="keyword">true</span></code>, then
3913                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3914                  returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3915                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3916                  returns <code class="computeroutput"><span class="keyword">false</span></code>.
3917                </p></dd>
3918<dt><span class="term">Throws:</span></dt>
3919<dd><p>
3920                  Any exceptions thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>.
3921                </p></dd>
3922</dl>
3923</div>
3924</div>
3925<div class="section">
3926<div class="titlepage"><div><div><h5 class="title">
3927<a name="thread.synchronization.locks.unique_lock.constructor_time_point"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_time_point" title="template &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>
3928          <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3929          <span class="identifier">m</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
3930</h5></div></div></div>
3931<div class="variablelist">
3932<p class="title"><b></b></p>
3933<dl class="variablelist">
3934<dt><span class="term">Effects:</span></dt>
3935<dd><p>
3936                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3937                  Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>, and takes ownership of the lock
3938                  state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3939                </p></dd>
3940<dt><span class="term">Postcondition:</span></dt>
3941<dd><p>
3942                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3943                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3944                  If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a> returned
3945                  <code class="computeroutput"><span class="keyword">true</span></code>, then <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3946                  returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3947                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3948                  returns <code class="computeroutput"><span class="keyword">false</span></code>.
3949                </p></dd>
3950<dt><span class="term">Throws:</span></dt>
3951<dd><p>
3952                  Any exceptions thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code>.
3953                </p></dd>
3954</dl>
3955</div>
3956</div>
3957<div class="section">
3958<div class="titlepage"><div><div><h5 class="title">
3959<a name="thread.synchronization.locks.unique_lock.constructor_duration"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.constructor_duration" title="template &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>
3960          <span class="identifier">unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
3961          <span class="identifier">m</span><span class="special">,</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
3962</h5></div></div></div>
3963<div class="variablelist">
3964<p class="title"><b></b></p>
3965<dl class="variablelist">
3966<dt><span class="term">Effects:</span></dt>
3967<dd><p>
3968                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
3969                  Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>,
3970                  and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
3971                </p></dd>
3972<dt><span class="term">Postcondition:</span></dt>
3973<dd><p>
3974                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
3975                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
3976                  If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a> returned
3977                  <code class="computeroutput"><span class="keyword">true</span></code>, then <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3978                  returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
3979                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
3980                  returns <code class="computeroutput"><span class="keyword">false</span></code>.
3981                </p></dd>
3982<dt><span class="term">Throws:</span></dt>
3983<dd><p>
3984                  Any exceptions thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">(</span><span class="identifier">rel_time</span><span class="special">)</span></code>.
3985                </p></dd>
3986</dl>
3987</div>
3988</div>
3989<div class="section">
3990<div class="titlepage"><div><div><h5 class="title">
3991<a name="thread.synchronization.locks.unique_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.destructor" title="~unique_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">unique_lock</span><span class="special">()</span></code></a>
3992</h5></div></div></div>
3993<div class="variablelist">
3994<p class="title"><b></b></p>
3995<dl class="variablelist">
3996<dt><span class="term">Effects:</span></dt>
3997<dd><p>
3998                  Invokes <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a><code class="computeroutput"><span class="special">-&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>
3999                  if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4000                  returns <code class="computeroutput"><span class="keyword">true</span></code>.
4001                </p></dd>
4002<dt><span class="term">Throws:</span></dt>
4003<dd><p>
4004                  Nothing.
4005                </p></dd>
4006</dl>
4007</div>
4008</div>
4009<div class="section">
4010<div class="titlepage"><div><div><h5 class="title">
4011<a name="thread.synchronization.locks.unique_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a>
4012</h5></div></div></div>
4013<div class="variablelist">
4014<p class="title"><b></b></p>
4015<dl class="variablelist">
4016<dt><span class="term">Returns:</span></dt>
4017<dd><p>
4018                  <code class="computeroutput"><span class="keyword">true</span></code> if the <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4019                  owns the lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4020                  with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
4021                </p></dd>
4022<dt><span class="term">Throws:</span></dt>
4023<dd><p>
4024                  Nothing.
4025                </p></dd>
4026</dl>
4027</div>
4028</div>
4029<div class="section">
4030<div class="titlepage"><div><div><h5 class="title">
4031<a name="thread.synchronization.locks.unique_lock.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
4032</h5></div></div></div>
4033<div class="variablelist">
4034<p class="title"><b></b></p>
4035<dl class="variablelist">
4036<dt><span class="term">Returns:</span></dt>
4037<dd><p>
4038                  A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4039                  with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
4040                  or <code class="computeroutput"><span class="identifier">NULL</span></code> if there
4041                  is no such object.
4042                </p></dd>
4043<dt><span class="term">Throws:</span></dt>
4044<dd><p>
4045                  Nothing.
4046                </p></dd>
4047</dl>
4048</div>
4049</div>
4050<div class="section">
4051<div class="titlepage"><div><div><h5 class="title">
4052<a name="thread.synchronization.locks.unique_lock.explicit_bool_conversion"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.explicit_bool_conversion" title="explicit operator bool() const"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
4053          <span class="keyword">bool</span><span class="special">()</span>
4054          <span class="keyword">const</span></code></a>
4055</h5></div></div></div>
4056<div class="variablelist">
4057<p class="title"><b></b></p>
4058<dl class="variablelist">
4059<dt><span class="term">Returns:</span></dt>
4060<dd><p>
4061                  <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span></code>.
4062                </p></dd>
4063<dt><span class="term">Throws:</span></dt>
4064<dd><p>
4065                  Nothing.
4066                </p></dd>
4067</dl>
4068</div>
4069</div>
4070<div class="section">
4071<div class="titlepage"><div><div><h5 class="title">
4072<a name="thread.synchronization.locks.unique_lock.release"></a><a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.release" title="Lockable* release()"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a>
4073</h5></div></div></div>
4074<div class="variablelist">
4075<p class="title"><b></b></p>
4076<dl class="variablelist">
4077<dt><span class="term">Effects:</span></dt>
4078<dd><p>
4079                  The association between <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is removed,
4080                  without affecting the lock state of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. If <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4081                  would have returned <code class="computeroutput"><span class="keyword">true</span></code>,
4082                  it is the responsibility of the calling code to ensure that the
4083                  <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is correctly
4084                  unlocked.
4085                </p></dd>
4086<dt><span class="term">Returns:</span></dt>
4087<dd><p>
4088                  A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4089                  with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4090                  at the point of the call, or <code class="computeroutput"><span class="identifier">NULL</span></code>
4091                  if there is no such object.
4092                </p></dd>
4093<dt><span class="term">Throws:</span></dt>
4094<dd><p>
4095                  Nothing.
4096                </p></dd>
4097<dt><span class="term">Postcondition:</span></dt>
4098<dd><p>
4099                  <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4100                  is no longer associated with any <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4101                  returns <code class="computeroutput"><span class="identifier">NULL</span></code> and
4102                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4103                  returns <code class="computeroutput"><span class="keyword">false</span></code>.
4104                </p></dd>
4105</dl>
4106</div>
4107</div>
4108</div>
4109<div class="section">
4110<div class="titlepage"><div><div><h4 class="title">
4111<a name="thread.synchronization.locks.shared_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14">Class template
4112        <code class="computeroutput"><span class="identifier">shared_lock</span></code> - C++14</a>
4113</h4></div></div></div>
4114<div class="toc"><dl class="toc">
4115<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.defaultconstructor"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">()</span></code></a></span></dt>
4116<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
4117          <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
4118<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_adopt"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
4119          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt>
4120<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_defer"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
4121          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a></span></dt>
4122<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_try"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
4123          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a></span></dt>
4124<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_abs_time"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span> <span class="special">&amp;</span>
4125          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
4126<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock</span><span class="special">()</span></code></a></span></dt>
4127<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt>
4128<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.mutex"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span></code></a></span></dt>
4129<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.explicit_operator_bool"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
4130          <span class="keyword">bool</span><span class="special">()</span>
4131          <span class="keyword">const</span></code></a></span></dt>
4132<dt><span class="section"><a href="synchronization.html#thread.synchronization.locks.shared_lock.release"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a></span></dt>
4133</dl></div>
4134<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4135<span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
4136
4137<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>
4138<span class="keyword">class</span> <span class="identifier">shared_lock</span>
4139<span class="special">{</span>
4140<span class="keyword">public</span><span class="special">:</span>
4141    <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4142
4143    <span class="comment">// Shared locking</span>
4144    <span class="identifier">shared_lock</span><span class="special">();</span>
4145    <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
4146    <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
4147    <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_lock_t</span><span class="special">);</span>
4148    <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span>
4149    <span class="keyword">template</span> <span class="special">&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>
4150    <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>
4151    <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>
4152    <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>
4153    <span class="special">~</span><span class="identifier">shared_lock</span><span class="special">();</span>
4154
4155    <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">shared_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
4156    <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>
4157
4158    <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>
4159    <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>
4160
4161    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4162    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4163    <span class="keyword">template</span> <span class="special">&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>
4164    <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
4165    <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>
4166    <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
4167    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4168
4169    <span class="comment">// Conversion from upgrade locking</span>
4170    <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&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>
4171
4172    <span class="comment">// Conversion from exclusive locking</span>
4173    <span class="keyword">explicit</span> <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special">&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>
4174
4175    <span class="comment">// Setters</span>
4176    <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4177    <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
4178
4179    <span class="comment">// Getters</span>
4180    <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4181    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4182    <span class="identifier">mutex_type</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4183
4184<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USE_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
4185    <span class="identifier">shared_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&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>
4186    <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">target_time</span><span class="special">);</span>
4187<span class="preprocessor">#endif</span>
4188<span class="special">};</span>
4189</pre>
4190<p>
4191          Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> models the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>, but rather than
4192          acquiring unique ownership of the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, locking an instance
4193          of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> acquires shared ownership.
4194        </p>
4195<p>
4196          Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, not only does it
4197          provide for RAII-style locking, it also allows for deferring acquiring
4198          the lock until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
4199          member function is called explicitly, or trying to acquire the lock in
4200          a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
4201          is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise
4202          adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object.
4203        </p>
4204<p>
4205          An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span>
4206          the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code>
4207          if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4208          returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
4209          and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4210          returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
4211          that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed,
4212          then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-&gt;</span><span class="identifier">unlock_shared</span><span class="special">()</span></code></a>.
4213        </p>
4214<p>
4215          The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> are not thread-safe.
4216          In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock" title="Class template shared_lock - C++14"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_lock</span></code></a> is intended to model
4217          the shared ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object by a particular
4218          thread, and the member functions that release ownership of the lock state
4219          (including the destructor) must be called by the same thread that acquired
4220          ownership of the lock state.
4221        </p>
4222<div class="section">
4223<div class="titlepage"><div><div><h5 class="title">
4224<a name="thread.synchronization.locks.shared_lock.defaultconstructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.defaultconstructor" title="shared_lock()"><code class="computeroutput"><span class="identifier">shared_lock</span><span class="special">()</span></code></a>
4225</h5></div></div></div>
4226<div class="variablelist">
4227<p class="title"><b></b></p>
4228<dl class="variablelist">
4229<dt><span class="term">Effects:</span></dt>
4230<dd><p>
4231                  Creates a lock object with no associated mutex.
4232                </p></dd>
4233<dt><span class="term">Postcondition:</span></dt>
4234<dd><p>
4235                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4236                  returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4237                  returns <code class="computeroutput"><span class="identifier">NULL</span></code>.
4238                </p></dd>
4239<dt><span class="term">Throws:</span></dt>
4240<dd><p>
4241                  Nothing.
4242                </p></dd>
4243</dl>
4244</div>
4245</div>
4246<div class="section">
4247<div class="titlepage"><div><div><h5 class="title">
4248<a name="thread.synchronization.locks.shared_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor" title="shared_lock(Lockable &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>
4249          <span class="identifier">m</span><span class="special">)</span></code></a>
4250</h5></div></div></div>
4251<div class="variablelist">
4252<p class="title"><b></b></p>
4253<dl class="variablelist">
4254<dt><span class="term">Effects:</span></dt>
4255<dd><p>
4256                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4257                  Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a>.
4258                </p></dd>
4259<dt><span class="term">Postcondition:</span></dt>
4260<dd><p>
4261                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4262                  returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4263                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4264                </p></dd>
4265<dt><span class="term">Throws:</span></dt>
4266<dd><p>
4267                  Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock_shared</span><span class="special">()</span></code></a>.
4268                </p></dd>
4269</dl>
4270</div>
4271</div>
4272<div class="section">
4273<div class="titlepage"><div><div><h5 class="title">
4274<a name="thread.synchronization.locks.shared_lock.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_adopt" title="shared_lock(Lockable &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>
4275          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
4276</h5></div></div></div>
4277<div class="variablelist">
4278<p class="title"><b></b></p>
4279<dl class="variablelist">
4280<dt><span class="term">Precondition:</span></dt>
4281<dd><p>
4282                  The current thread owns an exclusive lock on <code class="computeroutput"><span class="identifier">m</span></code>.
4283                </p></dd>
4284<dt><span class="term">Effects:</span></dt>
4285<dd><p>
4286                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4287                  Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
4288                </p></dd>
4289<dt><span class="term">Postcondition:</span></dt>
4290<dd><p>
4291                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4292                  returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4293                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4294                </p></dd>
4295<dt><span class="term">Throws:</span></dt>
4296<dd><p>
4297                  Nothing.
4298                </p></dd>
4299</dl>
4300</div>
4301</div>
4302<div class="section">
4303<div class="titlepage"><div><div><h5 class="title">
4304<a name="thread.synchronization.locks.shared_lock.constructor_defer"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_defer" title="shared_lock(Lockable &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>
4305          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">defer_lock_t</span><span class="special">)</span></code></a>
4306</h5></div></div></div>
4307<div class="variablelist">
4308<p class="title"><b></b></p>
4309<dl class="variablelist">
4310<dt><span class="term">Effects:</span></dt>
4311<dd><p>
4312                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4313                </p></dd>
4314<dt><span class="term">Postcondition:</span></dt>
4315<dd><p>
4316                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4317                  returns <code class="computeroutput"><span class="keyword">false</span></code>. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4318                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4319                </p></dd>
4320<dt><span class="term">Throws:</span></dt>
4321<dd><p>
4322                  Nothing.
4323                </p></dd>
4324</dl>
4325</div>
4326</div>
4327<div class="section">
4328<div class="titlepage"><div><div><h5 class="title">
4329<a name="thread.synchronization.locks.shared_lock.constructor_try"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_try" title="shared_lock(Lockable &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>
4330          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_to_lock_t</span><span class="special">)</span></code></a>
4331</h5></div></div></div>
4332<div class="variablelist">
4333<p class="title"><b></b></p>
4334<dl class="variablelist">
4335<dt><span class="term">Effects:</span></dt>
4336<dd><p>
4337                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4338                  Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>,
4339                  and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
4340                </p></dd>
4341<dt><span class="term">Postcondition:</span></dt>
4342<dd><p>
4343                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4344                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4345                  If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>
4346                  returned <code class="computeroutput"><span class="keyword">true</span></code>, then
4347                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4348                  returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
4349                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4350                  returns <code class="computeroutput"><span class="keyword">false</span></code>.
4351                </p></dd>
4352<dt><span class="term">Throws:</span></dt>
4353<dd><p>
4354                  Nothing.
4355                </p></dd>
4356</dl>
4357</div>
4358</div>
4359<div class="section">
4360<div class="titlepage"><div><div><h5 class="title">
4361<a name="thread.synchronization.locks.shared_lock.constructor_abs_time"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.constructor_abs_time" title="shared_lock(Lockable &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>
4362          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
4363</h5></div></div></div>
4364<div class="variablelist">
4365<p class="title"><b></b></p>
4366<dl class="variablelist">
4367<dt><span class="term">Effects:</span></dt>
4368<dd><p>
4369                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4370                  Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>,
4371                  and takes ownership of the lock state if the call returns <code class="computeroutput"><span class="keyword">true</span></code>.
4372                </p></dd>
4373<dt><span class="term">Postcondition:</span></dt>
4374<dd><p>
4375                  <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4376                  returns <code class="computeroutput"><span class="special">&amp;</span><span class="identifier">m</span></code>.
4377                  If the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a>
4378                  returned <code class="computeroutput"><span class="keyword">true</span></code>, then
4379                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4380                  returns <code class="computeroutput"><span class="keyword">true</span></code>, otherwise
4381                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4382                  returns <code class="computeroutput"><span class="keyword">false</span></code>.
4383                </p></dd>
4384<dt><span class="term">Throws:</span></dt>
4385<dd><p>
4386                  Any exceptions thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>.
4387                </p></dd>
4388</dl>
4389</div>
4390</div>
4391<div class="section">
4392<div class="titlepage"><div><div><h5 class="title">
4393<a name="thread.synchronization.locks.shared_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.destructor" title="~shared_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock</span><span class="special">()</span></code></a>
4394</h5></div></div></div>
4395<div class="variablelist">
4396<p class="title"><b></b></p>
4397<dl class="variablelist">
4398<dt><span class="term">Effects:</span></dt>
4399<dd><p>
4400                  Invokes <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a><code class="computeroutput"><span class="special">-&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>
4401                  if <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4402                  returns <code class="computeroutput"><span class="keyword">true</span></code>.
4403                </p></dd>
4404<dt><span class="term">Throws:</span></dt>
4405<dd><p>
4406                  Nothing.
4407                </p></dd>
4408</dl>
4409</div>
4410</div>
4411<div class="section">
4412<div class="titlepage"><div><div><h5 class="title">
4413<a name="thread.synchronization.locks.shared_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span></code></a>
4414</h5></div></div></div>
4415<div class="variablelist">
4416<p class="title"><b></b></p>
4417<dl class="variablelist">
4418<dt><span class="term">Returns:</span></dt>
4419<dd><p>
4420                  <code class="computeroutput"><span class="keyword">true</span></code> if the <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4421                  owns the lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4422                  with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
4423                </p></dd>
4424<dt><span class="term">Throws:</span></dt>
4425<dd><p>
4426                  Nothing.
4427                </p></dd>
4428</dl>
4429</div>
4430</div>
4431<div class="section">
4432<div class="titlepage"><div><div><h5 class="title">
4433<a name="thread.synchronization.locks.shared_lock.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.mutex" title="Lockable* mutex() const"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span></code></a>
4434</h5></div></div></div>
4435<div class="variablelist">
4436<p class="title"><b></b></p>
4437<dl class="variablelist">
4438<dt><span class="term">Returns:</span></dt>
4439<dd><p>
4440                  A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4441                  with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
4442                  or <code class="computeroutput"><span class="identifier">NULL</span></code> if there
4443                  is no such object.
4444                </p></dd>
4445<dt><span class="term">Throws:</span></dt>
4446<dd><p>
4447                  Nothing.
4448                </p></dd>
4449</dl>
4450</div>
4451</div>
4452<div class="section">
4453<div class="titlepage"><div><div><h5 class="title">
4454<a name="thread.synchronization.locks.shared_lock.explicit_operator_bool"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.explicit_operator_bool" title="explicit operator bool() const"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
4455          <span class="keyword">bool</span><span class="special">()</span>
4456          <span class="keyword">const</span></code></a>
4457</h5></div></div></div>
4458<div class="variablelist">
4459<p class="title"><b></b></p>
4460<dl class="variablelist">
4461<dt><span class="term">Returns:</span></dt>
4462<dd><p>
4463                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>.
4464                </p></dd>
4465<dt><span class="term">Throws:</span></dt>
4466<dd><p>
4467                  Nothing.
4468                </p></dd>
4469</dl>
4470</div>
4471</div>
4472<div class="section">
4473<div class="titlepage"><div><div><h5 class="title">
4474<a name="thread.synchronization.locks.shared_lock.release"></a><a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.release" title="Lockable* release()"><code class="computeroutput"><span class="identifier">Lockable</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span></code></a>
4475</h5></div></div></div>
4476<div class="variablelist">
4477<p class="title"><b></b></p>
4478<dl class="variablelist">
4479<dt><span class="term">Effects:</span></dt>
4480<dd><p>
4481                  The association between <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is removed,
4482                  without affecting the lock state of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. If <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4483                  would have returned <code class="computeroutput"><span class="keyword">true</span></code>,
4484                  it is the responsibility of the calling code to ensure that the
4485                  <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is correctly
4486                  unlocked.
4487                </p></dd>
4488<dt><span class="term">Returns:</span></dt>
4489<dd><p>
4490                  A pointer to the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object associated
4491                  with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4492                  at the point of the call, or <code class="computeroutput"><span class="identifier">NULL</span></code>
4493                  if there is no such object.
4494                </p></dd>
4495<dt><span class="term">Throws:</span></dt>
4496<dd><p>
4497                  Nothing.
4498                </p></dd>
4499<dt><span class="term">Postcondition:</span></dt>
4500<dd><p>
4501                  <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
4502                  is no longer associated with any <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object. <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4503                  returns <code class="computeroutput"><span class="identifier">NULL</span></code> and
4504                  <a class="link" href="synchronization.html#thread.synchronization.locks.shared_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4505                  returns <code class="computeroutput"><span class="keyword">false</span></code>.
4506                </p></dd>
4507</dl>
4508</div>
4509</div>
4510</div>
4511<div class="section">
4512<div class="titlepage"><div><div><h4 class="title">
4513<a name="thread.synchronization.locks.upgrade_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION">Class template
4514        <code class="computeroutput"><span class="identifier">upgrade_lock</span></code> - EXTENSION</a>
4515</h4></div></div></div>
4516<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4517<span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
4518
4519<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>
4520<span class="keyword">class</span> <span class="identifier">upgrade_lock</span>
4521<span class="special">{</span>
4522<span class="keyword">public</span><span class="special">:</span>
4523    <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4524
4525    <span class="comment">// Upgrade locking</span>
4526
4527    <span class="identifier">upgrade_lock</span><span class="special">();</span>
4528    <span class="keyword">explicit</span> <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
4529    <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&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>
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">try_to_lock_t</span><span class="special">);</span>
4531    <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">adopt_lock_t</span><span class="special">);</span>
4532    <span class="keyword">template</span> <span class="special">&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>
4533    <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>
4534                 <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>
4535    <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>
4536    <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>
4537                 <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>
4538    <span class="special">~</span><span class="identifier">upgrade_lock</span><span class="special">();</span>
4539
4540    <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">upgrade_lock</span><span class="special">&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    <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>
4542
4543    <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>
4544    <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>
4545
4546    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4547    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4548    <span class="keyword">template</span> <span class="special">&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>
4549    <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
4550    <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>
4551    <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
4552    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4553
4554<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span>
4555   <span class="comment">// Conversion from shared locking</span>
4556    <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">shared_lock</span><span class="special">&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>
4557    <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>
4558    <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>
4559                   <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>
4560    <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>
4561    <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>
4562                   <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>
4563<span class="preprocessor">#endif</span>
4564
4565    <span class="comment">// Conversion from exclusive locking</span>
4566    <span class="keyword">explicit</span> <span class="identifier">upgrade_lock</span><span class="special">(</span><span class="identifier">unique_lock</span><span class="special">&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>
4567
4568    <span class="comment">// Setters</span>
4569    <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4570    <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">release</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
4571
4572    <span class="comment">// Getters</span>
4573    <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4574    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4575    <span class="identifier">mutex_type</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4576<span class="special">};</span>
4577</pre>
4578<p>
4579          Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> models the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>, but rather than
4580          acquiring unique ownership of the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, locking an instance
4581          of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> acquires upgrade
4582          ownership.
4583        </p>
4584<p>
4585          Like <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>, not only does it
4586          provide for RAII-style locking, it also allows for deferring acquiring
4587          the lock until the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
4588          member function is called explicitly, or trying to acquire the lock in
4589          a non-blocking fashion, or with a timeout. Consequently, <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
4590          is only called in the destructor if the lock object has locked the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, or otherwise
4591          adopted a lock on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object.
4592        </p>
4593<p>
4594          An instance of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> is said to <span class="emphasis"><em>own</em></span>
4595          the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> <code class="computeroutput"><span class="identifier">m</span></code>
4596          if <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.mutex" title="Lockable* mutex() const noexcept"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code></a>
4597          returns a pointer to <code class="computeroutput"><span class="identifier">m</span></code>
4598          and <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a>
4599          returns <code class="computeroutput"><span class="keyword">true</span></code>. If an object
4600          that <span class="emphasis"><em>owns</em></span> the lock state of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object is destroyed,
4601          then the destructor will invoke <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable.unlock_upgrade" title="m.unlock_upgrade()"><code class="computeroutput"><span class="identifier">mutex</span><span class="special">()-&gt;</span><span class="identifier">unlock_upgrade</span><span class="special">()</span></code></a>.
4602        </p>
4603<p>
4604          The member functions of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> are not thread-safe.
4605          In particular, <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> is intended to model
4606          the upgrade ownership of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> object by a particular
4607          thread, and the member functions that release ownership of the lock state
4608          (including the destructor) must be called by the same thread that acquired
4609          ownership of the lock state.
4610        </p>
4611</div>
4612<div class="section">
4613<div class="titlepage"><div><div><h4 class="title">
4614<a name="thread.synchronization.locks.upgrade_to_unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION">Class
4615        template <code class="computeroutput"><span class="identifier">upgrade_to_unique_lock</span></code>
4616        -- EXTENSION</a>
4617</h4></div></div></div>
4618<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4619<span class="comment">// #include &lt;boost/thread/lock_types.hpp&gt; </span>
4620
4621<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>
4622<span class="keyword">class</span> <span class="identifier">upgrade_to_unique_lock</span>
4623<span class="special">{</span>
4624<span class="keyword">public</span><span class="special">:</span>
4625    <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4626    <span class="keyword">explicit</span> <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
4627    <span class="special">~</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">();</span>
4628
4629    <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span> <span class="keyword">const</span><span class="special">&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    <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>
4631
4632    <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">&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    <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>
4634
4635    <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">upgrade_to_unique_lock</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4636
4637    <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4638    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4639    <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4640
4641<span class="special">};</span>
4642</pre>
4643<p>
4644          <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_to_unique_lock</span></code></a> allows
4645          for a temporary upgrade of an <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a> to exclusive ownership.
4646          When constructed with a reference to an instance of <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_lock" title="Class template upgrade_lock - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_lock</span></code></a>, if that instance
4647          has upgrade ownership on some <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object, that ownership
4648          is upgraded to exclusive ownership. When the <a class="link" href="synchronization.html#thread.synchronization.locks.upgrade_to_unique_lock" title="Class template upgrade_to_unique_lock -- EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_to_unique_lock</span></code></a> instance
4649          is destroyed, the ownership of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> is downgraded back to
4650          <span class="emphasis"><em>upgrade ownership</em></span>.
4651        </p>
4652</div>
4653<div class="section">
4654<div class="titlepage"><div><div><h4 class="title">
4655<a name="thread.synchronization.locks.scoped_try_lock"></a><a class="link" href="synchronization.html#thread.synchronization.locks.scoped_try_lock" title="Mutex-specific class scoped_try_lock -- DEPRECATED">Mutex-specific
4656        class <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code> --
4657        DEPRECATED</a>
4658</h4></div></div></div>
4659<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span>
4660<span class="special">{</span>
4661<span class="keyword">private</span><span class="special">:</span>
4662    <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&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="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>
4664<span class="keyword">public</span><span class="special">:</span>
4665    <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">();</span>
4666    <span class="keyword">explicit</span> <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&amp;</span> <span class="identifier">m</span><span class="special">);</span>
4667    <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">adopt_lock_t</span><span class="special">);</span>
4668    <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">defer_lock_t</span><span class="special">);</span>
4669    <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">,</span><span class="identifier">try_to_lock_t</span><span class="special">);</span>
4670
4671    <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4672    <span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&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>
4673
4674    <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">MutexType</span><span class="special">::</span><span class="identifier">scoped_try_lock</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
4675
4676    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
4677    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
4678    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
4679
4680    <span class="identifier">MutexType</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4681    <span class="identifier">MutexType</span><span class="special">*</span> <span class="identifier">release</span><span class="special">();</span>
4682
4683    <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4684    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
4685<span class="special">};</span>
4686</pre>
4687<p>
4688          The member typedef <code class="computeroutput"><span class="identifier">scoped_try_lock</span></code>
4689          is provided for each distinct <code class="computeroutput"><span class="identifier">MutexType</span></code>
4690          as a typedef to a class with the preceding definition. The semantics of
4691          each constructor and member function are identical to those of <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">MutexType</span><span class="special">&gt;</span></code></a>
4692          for the same <code class="computeroutput"><span class="identifier">MutexType</span></code>,
4693          except that the constructor that takes a single reference to a mutex will
4694          call <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">try_lock</span><span class="special">()</span></code></a> rather than <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>.
4695        </p>
4696</div>
4697</div>
4698<div class="section">
4699<div class="titlepage"><div><div><h3 class="title">
4700<a name="thread.synchronization.other_locks"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks" title="Other Lock Types - EXTENSION">Other Lock Types
4701      - EXTENSION</a>
4702</h3></div></div></div>
4703<div class="toc"><dl class="toc">
4704<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks">Strict
4705        Locks</a></span></dt>
4706<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs">Locking
4707        pointers</a></span></dt>
4708<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked">Externally
4709        Locked</a></span></dt>
4710<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard">Class
4711        template <code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a></span></dt>
4712<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock">Class
4713        template <code class="computeroutput"><span class="identifier">reverse_lock</span></code></a></span></dt>
4714</dl></div>
4715<div class="section">
4716<div class="titlepage"><div><div><h4 class="title">
4717<a name="thread.synchronization.other_locks.strict_locks"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks" title="Strict Locks">Strict
4718        Locks</a>
4719</h4></div></div></div>
4720<div class="toc"><dl class="toc">
4721<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock">Class
4722          template <code class="computeroutput"><span class="identifier">strict_lock</span></code></a></span></dt>
4723<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock">Class
4724          template <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a></span></dt>
4725<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_strict_lock">Non
4726          Member Function <code class="computeroutput"><span class="identifier">make_strict_lock</span></code></a></span></dt>
4727<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_nested_strict_lock">Non
4728          Member Function <code class="computeroutput"><span class="identifier">make_nested_strict_lock</span></code></a></span></dt>
4729</dl></div>
4730<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt; </span>
4731<span class="comment">// #include &lt;boost/thread/strict_lock.hpp&gt; </span>
4732
4733<span class="keyword">namespace</span> <span class="identifier">boost</span>
4734<span class="special">{</span>
4735
4736  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4737  <span class="keyword">class</span> <span class="identifier">strict_lock</span><span class="special">;</span>
4738  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
4739  <span class="keyword">class</span> <span class="identifier">nested_strict_lock</span><span class="special">;</span>
4740  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4741  <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>
4742  <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>
4743  <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>
4744
4745<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_STRICT_LOCK</span>
4746  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4747  <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>
4748<span class="preprocessor">#endif</span>
4749<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_NO_MAKE_NESTED_STRICT_LOCK</span>
4750  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
4751  <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>
4752<span class="preprocessor">#endif</span>
4753
4754<span class="special">}</span>
4755</pre>
4756<div class="section">
4757<div class="titlepage"><div><div><h5 class="title">
4758<a name="thread.synchronization.other_locks.strict_locks.strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock">Class
4759          template <code class="computeroutput"><span class="identifier">strict_lock</span></code></a>
4760</h5></div></div></div>
4761<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4762<span class="comment">// #include &lt;boost/thread/strict_lock.hpp&gt; </span>
4763
4764<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>
4765<span class="keyword">class</span> <span class="identifier">strict_lock</span>
4766<span class="special">{</span>
4767<span class="keyword">public</span><span class="special">:</span>
4768    <span class="keyword">typedef</span> <span class="identifier">BasicLockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4769    <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">strict_lock</span> <span class="keyword">const</span><span class="special">&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="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>
4771    <span class="keyword">explicit</span> <span class="identifier">strict_lock</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
4772    <span class="special">~</span><span class="identifier">strict_lock</span><span class="special">();</span>
4773
4774    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
4775<span class="special">};</span>
4776</pre>
4777<p>
4778            <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock"><code class="computeroutput"><span class="identifier">strict_lock</span></code></a> is a model of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>.
4779          </p>
4780<p>
4781            <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock" title="Class template strict_lock"><code class="computeroutput"><span class="identifier">strict_lock</span></code></a> is the simplest
4782            <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>: on construction
4783            it acquires ownership of the implementation of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> concept supplied
4784            as the constructor parameter. On destruction, the ownership is released.
4785            This provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable" title="BasicLockable Concept"><code class="computeroutput"><span class="identifier">BasicLockable</span></code></a> object, to facilitate
4786            exception-safe locking and unlocking.
4787          </p>
4788<h6>
4789<a name="thread.synchronization.other_locks.strict_locks.strict_lock.h0"></a>
4790            <span class="phrase"><a name="thread.synchronization.other_locks.strict_locks.strict_lock.see_also__link_linkend__thread_synchronization_lock_guard_lock_guard___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__lock_guard__phrase___code___link_"></a></span><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.see_also__link_linkend__thread_synchronization_lock_guard_lock_guard___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__lock_guard__phrase___code___link_">See
4791            also <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span></code></a>
4792          </h6>
4793<div class="section">
4794<div class="titlepage"><div><div><h6 class="title">
4795<a name="thread.synchronization.other_locks.strict_locks.strict_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.constructor" title="strict_lock(Lockable &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>
4796            <span class="identifier">m</span><span class="special">)</span></code></a>
4797</h6></div></div></div>
4798<div class="variablelist">
4799<p class="title"><b></b></p>
4800<dl class="variablelist">
4801<dt><span class="term">Effects:</span></dt>
4802<dd><p>
4803                    Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
4804                    Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
4805                  </p></dd>
4806<dt><span class="term">Throws:</span></dt>
4807<dd><p>
4808                    Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
4809                  </p></dd>
4810</dl>
4811</div>
4812</div>
4813<div class="section">
4814<div class="titlepage"><div><div><h6 class="title">
4815<a name="thread.synchronization.other_locks.strict_locks.strict_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.strict_lock.destructor" title="~strict_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">strict_lock</span><span class="special">()</span></code></a>
4816</h6></div></div></div>
4817<div class="variablelist">
4818<p class="title"><b></b></p>
4819<dl class="variablelist">
4820<dt><span class="term">Effects:</span></dt>
4821<dd><p>
4822                    Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a>
4823                    on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed
4824                    to the constructor.
4825                  </p></dd>
4826<dt><span class="term">Throws:</span></dt>
4827<dd><p>
4828                    Nothing.
4829                  </p></dd>
4830</dl>
4831</div>
4832</div>
4833</div>
4834<div class="section">
4835<div class="titlepage"><div><div><h5 class="title">
4836<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock" title="Class template nested_strict_lock">Class
4837          template <code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a>
4838</h5></div></div></div>
4839<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
4840<span class="comment">// #include &lt;boost/thread/strict_lock.hpp&gt; </span>
4841
4842<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>
4843<span class="keyword">class</span> <span class="identifier">nested_strict_lock</span>
4844<span class="special">{</span>
4845<span class="keyword">public</span><span class="special">:</span>
4846    <span class="keyword">typedef</span> <span class="identifier">BasicLockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
4847    <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">nested_strict_lock</span> <span class="keyword">const</span><span class="special">&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="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>
4849    <span class="keyword">explicit</span> <span class="identifier">nested_strict_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">lk</span><span class="special">),</span>
4850    <span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
4851
4852    <span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">l</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
4853<span class="special">};</span>
4854</pre>
4855<p>
4856            <a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock" title="Class template nested_strict_lock"><code class="computeroutput"><span class="identifier">nested_strict_lock</span></code></a> is a model
4857            of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>.
4858          </p>
4859<p>
4860            A nested strict lock is a scoped lock guard ensuring a mutex is locked
4861            on its scope, by taking ownership of a nesting lock, locking the mutex
4862            on construction if not already locked and restoring the ownership to
4863            the nesting lock on destruction.
4864          </p>
4865<h6>
4866<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.h0"></a>
4867            <span class="phrase"><a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.see_also__link_linkend__thread_synchronization_other_locks_strict_locks_strict_lock___code__phrase_role__identifier__strict_lock__phrase___code___link_____link_linkend__thread_synchronization_locks_unique_lock___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__unique_lock__phrase___code___link_"></a></span><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.see_also__link_linkend__thread_synchronization_other_locks_strict_locks_strict_lock___code__phrase_role__identifier__strict_lock__phrase___code___link_____link_linkend__thread_synchronization_locks_unique_lock___code__phrase_role__identifier__boost__phrase__phrase_role__special______phrase__phrase_role__identifier__unique_lock__phrase___code___link_">See
4868            also <code class="computeroutput"><span class="identifier">strict_lock</span></code>, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a>
4869          </h6>
4870<div class="section">
4871<div class="titlepage"><div><div><h6 class="title">
4872<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.constructor" title="nested_strict_lock(Lock &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>
4873            <span class="identifier">lk</span><span class="special">)</span></code></a>
4874</h6></div></div></div>
4875<div class="variablelist">
4876<p class="title"><b></b></p>
4877<dl class="variablelist">
4878<dt><span class="term">Requires:</span></dt>
4879<dd><p>
4880                    <code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()</span>
4881                    <span class="special">!=</span> <span class="identifier">null_ptr</span></code>.
4882                  </p></dd>
4883<dt><span class="term">Effects:</span></dt>
4884<dd><p>
4885                    Stores the reference to the lock parameter <code class="computeroutput"><span class="identifier">lk</span></code>
4886                    and takes ownership on it. If the lock doesn't owns the mutex
4887                    lock it.
4888                  </p></dd>
4889<dt><span class="term">Postcondition:</span></dt>
4890<dd><p>
4891                    <code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">())</span></code>.
4892                  </p></dd>
4893<dt><span class="term">Throws:</span></dt>
4894<dd>
4895<p>
4896                    - lock_error when BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
4897                    is defined and lk.mutex() == null_ptr
4898                  </p>
4899<p>
4900                    - Any exception that @c lk.lock() can throw.
4901                  </p>
4902</dd>
4903</dl>
4904</div>
4905</div>
4906<div class="section">
4907<div class="titlepage"><div><div><h6 class="title">
4908<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.destructor" title="~nested_strict_lock() noexcept"><code class="computeroutput"><span class="special">~</span><span class="identifier">nested_strict_lock</span><span class="special">()</span> <span class="keyword">noexcept</span></code></a>
4909</h6></div></div></div>
4910<div class="variablelist">
4911<p class="title"><b></b></p>
4912<dl class="variablelist">
4913<dt><span class="term">Effects:</span></dt>
4914<dd><p>
4915                    Restores ownership to the nesting lock.
4916                  </p></dd>
4917</dl>
4918</div>
4919</div>
4920<div class="section">
4921<div class="titlepage"><div><div><h6 class="title">
4922<a name="thread.synchronization.other_locks.strict_locks.nested_strict_lock.owns_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.nested_strict_lock.owns_lock" title="bool owns_lock(mutex_type const* l) const noexcept"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">owns_lock</span><span class="special">(</span><span class="identifier">mutex_type</span>
4923            <span class="keyword">const</span><span class="special">*</span>
4924            <span class="identifier">l</span><span class="special">)</span>
4925            <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
4926</h6></div></div></div>
4927<div class="variablelist">
4928<p class="title"><b></b></p>
4929<dl class="variablelist">
4930<dt><span class="term">Return:</span></dt>
4931<dd><p>
4932                    Whether if this lock is locking that mutex.
4933                  </p></dd>
4934</dl>
4935</div>
4936</div>
4937</div>
4938<div class="section">
4939<div class="titlepage"><div><div><h5 class="title">
4940<a name="thread.synchronization.other_locks.strict_locks.make_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_strict_lock" title="Non Member Function make_strict_lock">Non
4941          Member Function <code class="computeroutput"><span class="identifier">make_strict_lock</span></code></a>
4942</h5></div></div></div>
4943<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
4944<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>
4945</pre>
4946<div class="variablelist">
4947<p class="title"><b></b></p>
4948<dl class="variablelist">
4949<dt><span class="term">Returns:</span></dt>
4950<dd><p>
4951                  a strict_lock as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">m</span><span class="special">}</span></code>.
4952                </p></dd>
4953<dt><span class="term">Throws:</span></dt>
4954<dd><p>
4955                  Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
4956                </p></dd>
4957</dl>
4958</div>
4959</div>
4960<div class="section">
4961<div class="titlepage"><div><div><h5 class="title">
4962<a name="thread.synchronization.other_locks.strict_locks.make_nested_strict_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.strict_locks.make_nested_strict_lock" title="Non Member Function make_nested_strict_lock">Non
4963          Member Function <code class="computeroutput"><span class="identifier">make_nested_strict_lock</span></code></a>
4964</h5></div></div></div>
4965<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
4966<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>
4967</pre>
4968<div class="variablelist">
4969<p class="title"><b></b></p>
4970<dl class="variablelist">
4971<dt><span class="term">Returns:</span></dt>
4972<dd><p>
4973                  a nested_strict_lock as if initialized with <code class="computeroutput"><span class="special">{</span><span class="identifier">lk</span><span class="special">}</span></code>.
4974                </p></dd>
4975<dt><span class="term">Throws:</span></dt>
4976<dd><p>
4977                  Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
4978                </p></dd>
4979</dl>
4980</div>
4981</div>
4982</div>
4983<div class="section">
4984<div class="titlepage"><div><div><h4 class="title">
4985<a name="thread.synchronization.other_locks.lock_ptrs"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs" title="Locking pointers">Locking
4986        pointers</a>
4987</h4></div></div></div>
4988<div class="toc"><dl class="toc">
4989<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr">Class
4990          template <code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span>
4991          </code></a></span></dt>
4992<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr">Class
4993          template <code class="computeroutput"><span class="identifier">strict_lock_ptr</span></code></a></span></dt>
4994</dl></div>
4995<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/synchroniezd_value.hpp&gt; </span>
4996<span class="comment">// #include &lt;boost/thread/strict_lock_ptr.hpp&gt; </span>
4997
4998<span class="keyword">namespace</span> <span class="identifier">boost</span>
4999<span class="special">{</span>
5000
5001  <span class="keyword">template</span><span class="special">&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>
5002  <span class="keyword">class</span> <span class="identifier">strict_lock_ptr</span><span class="special">;</span>
5003  <span class="keyword">template</span><span class="special">&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>
5004  <span class="keyword">class</span> <span class="identifier">const_strict_lock_ptr</span><span class="special">;</span>
5005<span class="special">}</span>
5006</pre>
5007<div class="section">
5008<div class="titlepage"><div><div><h5 class="title">
5009<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr" title="Class template const_strict_lock_ptr">Class
5010          template <code class="computeroutput"><span class="identifier">const_strict_lock_ptr</span>
5011          </code></a>
5012</h5></div></div></div>
5013<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/synchroniezd_value.hpp&gt; </span>
5014<span class="comment">// #include &lt;boost/thread/strict_lock_ptr.hpp&gt; </span>
5015
5016
5017<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>
5018<span class="keyword">class</span> <span class="identifier">const_strict_lock_ptr</span>
5019<span class="special">{</span>
5020<span class="keyword">public</span><span class="special">:</span>
5021  <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span>
5022  <span class="keyword">typedef</span> <span class="identifier">Lockable</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5023
5024  <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">const_strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&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  <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>
5026
5027  <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
5028  <span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
5029
5030  <span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">();</span>
5031
5032  <span class="keyword">const</span> <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span><span class="special">;</span>
5033  <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>
5034
5035<span class="special">};</span>
5036</pre>
5037<div class="section">
5038<div class="titlepage"><div><div><h6 class="title">
5039<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor" title="const_strict_lock_ptr(T const&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>
5040</h6></div></div></div>
5041<pre class="programlisting"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
5042</pre>
5043<div class="variablelist">
5044<p class="title"><b></b></p>
5045<dl class="variablelist">
5046<dt><span class="term">Effects:</span></dt>
5047<dd><p>
5048                    Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>,
5049                    stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5050                  </p></dd>
5051<dt><span class="term">Throws:</span></dt>
5052<dd><p>
5053                    Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
5054                  </p></dd>
5055</dl>
5056</div>
5057</div>
5058<div class="section">
5059<div class="titlepage"><div><div><h6 class="title">
5060<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.constructor_adopt" title="const_strict_lock_ptr(T const&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>
5061</h6></div></div></div>
5062<pre class="programlisting"><span class="identifier">const_strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
5063</pre>
5064<div class="variablelist">
5065<p class="title"><b></b></p>
5066<dl class="variablelist">
5067<dt><span class="term">Effects:</span></dt>
5068<dd><p>
5069                    Stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5070                  </p></dd>
5071<dt><span class="term">Throws:</span></dt>
5072<dd><p>
5073                    Nothing.
5074                  </p></dd>
5075</dl>
5076</div>
5077</div>
5078<div class="section">
5079<div class="titlepage"><div><div><h6 class="title">
5080<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.destructor" title="~const_strict_lock_ptr()"><code class="computeroutput"><span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">()</span></code></a>
5081</h6></div></div></div>
5082<pre class="programlisting"><span class="special">~</span><span class="identifier">const_strict_lock_ptr</span><span class="special">();</span>
5083</pre>
5084<div class="variablelist">
5085<p class="title"><b></b></p>
5086<dl class="variablelist">
5087<dt><span class="term">Effects:</span></dt>
5088<dd><p>
5089                    Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a>
5090                    on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed
5091                    to the constructor.
5092                  </p></dd>
5093<dt><span class="term">Throws:</span></dt>
5094<dd><p>
5095                    Nothing.
5096                  </p></dd>
5097</dl>
5098</div>
5099</div>
5100<div class="section">
5101<div class="titlepage"><div><div><h6 class="title">
5102<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.indir"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.indir" title="operator-&gt;() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;()</span>
5103            <span class="keyword">const</span></code></a>
5104</h6></div></div></div>
5105<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;()</span> <span class="keyword">const</span><span class="special">;</span>
5106</pre>
5107<div class="variablelist">
5108<p class="title"><b></b></p>
5109<dl class="variablelist">
5110<dt><span class="term">Return:</span></dt>
5111<dd><p>
5112                    return a constant pointer to the protected value.
5113                  </p></dd>
5114<dt><span class="term">Throws:</span></dt>
5115<dd><p>
5116                    Nothing.
5117                  </p></dd>
5118</dl>
5119</div>
5120</div>
5121<div class="section">
5122<div class="titlepage"><div><div><h6 class="title">
5123<a name="thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.deref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.const_strict_lock_ptr.deref" title="operator*() const"><code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span>
5124            <span class="keyword">const</span></code></a>
5125</h6></div></div></div>
5126<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span>
5127</pre>
5128<div class="variablelist">
5129<p class="title"><b></b></p>
5130<dl class="variablelist">
5131<dt><span class="term">Return:</span></dt>
5132<dd><p>
5133                    return a constant reference to the protected value.
5134                  </p></dd>
5135<dt><span class="term">Throws:</span></dt>
5136<dd><p>
5137                    Nothing.
5138                  </p></dd>
5139</dl>
5140</div>
5141</div>
5142</div>
5143<div class="section">
5144<div class="titlepage"><div><div><h5 class="title">
5145<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr" title="Class template strict_lock_ptr">Class
5146          template <code class="computeroutput"><span class="identifier">strict_lock_ptr</span></code></a>
5147</h5></div></div></div>
5148<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/synchroniezd_value.hpp&gt; </span>
5149<span class="comment">// #include &lt;boost/thread/strict_lock_ptr.hpp&gt; </span>
5150
5151<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>
5152<span class="keyword">class</span> <span class="identifier">strict_lock_ptr</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">const_strict_lock_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">Lockable</span><span class="special">&gt;</span>
5153<span class="special">{</span>
5154<span class="keyword">public</span><span class="special">:</span>
5155  <span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">strict_lock_ptr</span> <span class="keyword">const</span><span class="special">&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  <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>
5157
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>
5159  <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>
5160  <span class="special">~</span><span class="identifier">strict_lock_ptr</span><span class="special">();</span>
5161
5162  <span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;();</span>
5163  <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*();</span>
5164
5165<span class="special">};</span>
5166</pre>
5167<div class="section">
5168<div class="titlepage"><div><div><h6 class="title">
5169<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor" title="strict_lock_ptr(T const&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>
5170</h6></div></div></div>
5171<pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
5172</pre>
5173<div class="variablelist">
5174<p class="title"><b></b></p>
5175<dl class="variablelist">
5176<dt><span class="term">Effects:</span></dt>
5177<dd><p>
5178                    Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>,
5179                    stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5180                  </p></dd>
5181<dt><span class="term">Throws:</span></dt>
5182<dd><p>
5183                    Any exception thrown by the call to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code></a>.
5184                  </p></dd>
5185</dl>
5186</div>
5187</div>
5188<div class="section">
5189<div class="titlepage"><div><div><h6 class="title">
5190<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.constructor_adopt" title="strict_lock_ptr(T const&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>
5191</h6></div></div></div>
5192<pre class="programlisting"><span class="identifier">strict_lock_ptr</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
5193</pre>
5194<div class="variablelist">
5195<p class="title"><b></b></p>
5196<dl class="variablelist">
5197<dt><span class="term">Effects:</span></dt>
5198<dd><p>
5199                    Stores a reference to it and to the value type <code class="computeroutput"><span class="identifier">val</span></code>.
5200                  </p></dd>
5201<dt><span class="term">Throws:</span></dt>
5202<dd><p>
5203                    Nothing.
5204                  </p></dd>
5205</dl>
5206</div>
5207</div>
5208<div class="section">
5209<div class="titlepage"><div><div><h6 class="title">
5210<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.destructor" title="~strict_lock_ptr()"><code class="computeroutput"><span class="special">~</span><span class="identifier">strict_lock_ptr</span><span class="special">()</span></code></a>
5211</h6></div></div></div>
5212<pre class="programlisting"><span class="special">~</span> <span class="identifier">strict_lock_ptr</span><span class="special">();</span>
5213</pre>
5214<div class="variablelist">
5215<p class="title"><b></b></p>
5216<dl class="variablelist">
5217<dt><span class="term">Effects:</span></dt>
5218<dd><p>
5219                    Invokes <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code></a>
5220                    on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> object passed
5221                    to the constructor.
5222                  </p></dd>
5223<dt><span class="term">Throws:</span></dt>
5224<dd><p>
5225                    Nothing.
5226                  </p></dd>
5227</dl>
5228</div>
5229</div>
5230<div class="section">
5231<div class="titlepage"><div><div><h6 class="title">
5232<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.indir"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.indir" title="operator-&gt;()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">-&gt;()</span></code></a>
5233</h6></div></div></div>
5234<pre class="programlisting"><span class="identifier">T</span><span class="special">*</span> <span class="keyword">operator</span><span class="special">-&gt;();</span>
5235</pre>
5236<div class="variablelist">
5237<p class="title"><b></b></p>
5238<dl class="variablelist">
5239<dt><span class="term">Return:</span></dt>
5240<dd><p>
5241                    return a pointer to the protected value.
5242                  </p></dd>
5243<dt><span class="term">Throws:</span></dt>
5244<dd><p>
5245                    Nothing.
5246                  </p></dd>
5247</dl>
5248</div>
5249</div>
5250<div class="section">
5251<div class="titlepage"><div><div><h6 class="title">
5252<a name="thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.deref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.lock_ptrs.strict_lock_ptr.deref" title="operator*()"><code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code></a>
5253</h6></div></div></div>
5254<pre class="programlisting"><span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">*();</span>
5255</pre>
5256<div class="variablelist">
5257<p class="title"><b></b></p>
5258<dl class="variablelist">
5259<dt><span class="term">Return:</span></dt>
5260<dd><p>
5261                    return a reference to the protected value.
5262                  </p></dd>
5263<dt><span class="term">Throws:</span></dt>
5264<dd><p>
5265                    Nothing.
5266                  </p></dd>
5267</dl>
5268</div>
5269</div>
5270</div>
5271</div>
5272<div class="section">
5273<div class="titlepage"><div><div><h4 class="title">
5274<a name="thread.synchronization.other_locks.externally_locked"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked" title="Externally Locked">Externally
5275        Locked</a>
5276</h4></div></div></div>
5277<div class="toc"><dl class="toc">
5278<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked">Template
5279          Class <code class="computeroutput"><span class="identifier">externally_locked</span></code></a></span></dt>
5280<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref">Template
5281          Class <code class="computeroutput"><span class="identifier">externally_locked</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&amp;&gt;</span></code></a></span></dt>
5282<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.externally_locked.swap"><code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;,</span>
5283          <span class="identifier">externally_locked</span><span class="special">&amp;)</span></code></a></span></dt>
5284</dl></div>
5285<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/externally_locked.hpp&gt;</span>
5286<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>
5287<span class="keyword">class</span> <span class="identifier">externally_locked</span><span class="special">;</span>
5288<span class="keyword">template</span> <span class="special">&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>
5289<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>
5290
5291<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>
5292<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>
5293</pre>
5294<div class="section">
5295<div class="titlepage"><div><div><h5 class="title">
5296<a name="thread.synchronization.other_locks.externally_locked.externally_locked"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked" title="Template Class externally_locked">Template
5297          Class <code class="computeroutput"><span class="identifier">externally_locked</span></code></a>
5298</h5></div></div></div>
5299<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/externally_locked.hpp&gt;</span>
5300
5301<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>
5302<span class="keyword">class</span> <span class="identifier">externally_locked</span>
5303<span class="special">{</span>
5304  <span class="comment">//BOOST_CONCEPT_ASSERT(( CopyConstructible&lt;T&gt; ));</span>
5305  <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>
5306
5307<span class="keyword">public</span><span class="special">:</span>
5308  <span class="keyword">typedef</span> <span class="identifier">MutexType</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5309
5310  <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&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>
5311  <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>
5312  <span class="keyword">explicit</span> <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
5313  <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5314  <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&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="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5316  <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>
5317
5318  <span class="comment">// observers</span>
5319  <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>
5320  <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>
5321
5322  <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>
5323  <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>
5324  <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>
5325  <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>
5326
5327  <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>
5328  <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>
5329  <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>
5330  <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>
5331
5332 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
5333
5334  <span class="comment">// modifiers</span>
5335  <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
5336  <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
5337  <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
5338  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;);</span>
5339<span class="special">};</span>
5340</pre>
5341<p>
5342            <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
5343            a model of <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, it cloaks an object
5344            of type <code class="computeroutput"><span class="identifier">T</span></code>, and actually
5345            provides full access to that object through the get and set member functions,
5346            provided you pass a reference to a strict lock object.
5347          </p>
5348<p>
5349            Only the specificities respect to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> are described here.
5350          </p>
5351<div class="section">
5352<div class="titlepage"><div><div><h6 class="title">
5353<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor1" title="externally_locked(mutex_type&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>
5354            <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;)</span></code></a>
5355</h6></div></div></div>
5356<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&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>
5357</pre>
5358<div class="variablelist">
5359<p class="title"><b></b></p>
5360<dl class="variablelist">
5361<dt><span class="term">Requires:</span></dt>
5362<dd><p>
5363                    T is a model of CopyConstructible.
5364                  </p></dd>
5365<dt><span class="term">Effects:</span></dt>
5366<dd><p>
5367                    Constructs an externally locked object copying the cloaked type.
5368                  </p></dd>
5369<dt><span class="term">Throws:</span></dt>
5370<dd><p>
5371                    Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span></code>.
5372                  </p></dd>
5373</dl>
5374</div>
5375</div>
5376<div class="section">
5377<div class="titlepage"><div><div><h6 class="title">
5378<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor2" title="externally_locked(mutex_type&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>
5379            <span class="identifier">T</span><span class="special">&amp;&amp;)</span></code></a>
5380</h6></div></div></div>
5381<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&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>
5382</pre>
5383<div class="variablelist">
5384<p class="title"><b></b></p>
5385<dl class="variablelist">
5386<dt><span class="term">Requires:</span></dt>
5387<dd><p>
5388                    T is a model of Movable.
5389                  </p></dd>
5390<dt><span class="term">Effects:</span></dt>
5391<dd><p>
5392                    Constructs an externally locked object by moving the cloaked
5393                    type.
5394                  </p></dd>
5395<dt><span class="term">Throws:</span></dt>
5396<dd><p>
5397                    Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">obj</span><span class="special">)</span></code>.
5398                  </p></dd>
5399</dl>
5400</div>
5401</div>
5402<div class="section">
5403<div class="titlepage"><div><div><h6 class="title">
5404<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor3" title="externally_locked(mutex_type&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>
5405</h6></div></div></div>
5406<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
5407</pre>
5408<div class="variablelist">
5409<p class="title"><b></b></p>
5410<dl class="variablelist">
5411<dt><span class="term">Requires:</span></dt>
5412<dd><p>
5413                    T is a model of DefaultConstructible.
5414                  </p></dd>
5415<dt><span class="term">Effects:</span></dt>
5416<dd><p>
5417                    Constructs an externally locked object by default constructing
5418                    the cloaked type.
5419                  </p></dd>
5420<dt><span class="term">Throws:</span></dt>
5421<dd><p>
5422                    Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">()</span></code>.
5423                  </p></dd>
5424</dl>
5425</div>
5426</div>
5427<div class="section">
5428<div class="titlepage"><div><div><h6 class="title">
5429<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor4" title="externally_locked(externally_locked&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>
5430</h6></div></div></div>
5431<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5432</pre>
5433<div class="variablelist">
5434<p class="title"><b></b></p>
5435<dl class="variablelist">
5436<dt><span class="term">Requires:</span></dt>
5437<dd><p>
5438                    T is a model of Movable.
5439                  </p></dd>
5440<dt><span class="term">Effects:</span></dt>
5441<dd><p>
5442                    Move constructs an externally locked object by moving the cloaked
5443                    type and copying the mutex reference
5444                  </p></dd>
5445<dt><span class="term">Throws:</span></dt>
5446<dd><p>
5447                    Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;&amp;)</span></code>.
5448                  </p></dd>
5449</dl>
5450</div>
5451</div>
5452<div class="section">
5453<div class="titlepage"><div><div><h6 class="title">
5454<a name="thread.synchronization.other_locks.externally_locked.externally_locked.constructor5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.constructor5" title="externally_locked(externally_locked&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>
5455</h6></div></div></div>
5456<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">);</span>
5457</pre>
5458<div class="variablelist">
5459<p class="title"><b></b></p>
5460<dl class="variablelist">
5461<dt><span class="term">Requires:</span></dt>
5462<dd><p>
5463                    T is a model of Copyable.
5464                  </p></dd>
5465<dt><span class="term">Effects:</span></dt>
5466<dd><p>
5467                    Copy constructs an externally locked object by copying the cloaked
5468                    type and copying the mutex reference
5469                  </p></dd>
5470<dt><span class="term">Throws:</span></dt>
5471<dd><p>
5472                    Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">T</span><span class="special">&amp;)</span></code>.
5473                  </p></dd>
5474</dl>
5475</div>
5476</div>
5477<div class="section">
5478<div class="titlepage"><div><div><h6 class="title">
5479<a name="thread.synchronization.other_locks.externally_locked.externally_locked.assign4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.assign4" title="externally_locked(externally_locked&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>
5480</h6></div></div></div>
5481<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>
5482</pre>
5483<div class="variablelist">
5484<p class="title"><b></b></p>
5485<dl class="variablelist">
5486<dt><span class="term">Requires:</span></dt>
5487<dd><p>
5488                    T is a model of Movable.
5489                  </p></dd>
5490<dt><span class="term">Effects:</span></dt>
5491<dd><p>
5492                    Move assigns an externally locked object by moving the cloaked
5493                    type and copying the mutex reference
5494                  </p></dd>
5495<dt><span class="term">Throws:</span></dt>
5496<dd><p>
5497                    Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&amp;&amp;)</span></code>.
5498                  </p></dd>
5499</dl>
5500</div>
5501</div>
5502<div class="section">
5503<div class="titlepage"><div><div><h6 class="title">
5504<a name="thread.synchronization.other_locks.externally_locked.externally_locked.assign5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.assign5" title="externally_locked(externally_locked&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>
5505</h6></div></div></div>
5506<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>
5507</pre>
5508<div class="variablelist">
5509<p class="title"><b></b></p>
5510<dl class="variablelist">
5511<dt><span class="term">Requires:</span></dt>
5512<dd><p>
5513                    T is a model of Copyable.
5514                  </p></dd>
5515<dt><span class="term">Effects:</span></dt>
5516<dd><p>
5517                    Copy assigns an externally locked object by copying the cloaked
5518                    type and copying the mutex reference
5519                  </p></dd>
5520<dt><span class="term">Throws:</span></dt>
5521<dd><p>
5522                    Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&amp;)</span></code>.
5523                  </p></dd>
5524</dl>
5525</div>
5526</div>
5527<div class="section">
5528<div class="titlepage"><div><div><h6 class="title">
5529<a name="thread.synchronization.other_locks.externally_locked.externally_locked.get1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get1" title="get(strict_lock&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>
5530</h6></div></div></div>
5531<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>
5532<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>
5533</pre>
5534<div class="variablelist">
5535<p class="title"><b></b></p>
5536<dl class="variablelist">
5537<dt><span class="term">Requires:</span></dt>
5538<dd><p>
5539                    The <code class="computeroutput"><span class="identifier">lk</span></code> parameter
5540                    must be locking the associated mutex.
5541                  </p></dd>
5542<dt><span class="term">Returns:</span></dt>
5543<dd><p>
5544                    A reference to the cloaked object
5545                  </p></dd>
5546<dt><span class="term">Throws:</span></dt>
5547<dd><p>
5548                    <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5549                    <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5550                    is defined and the run-time preconditions are not satisfied .
5551                  </p></dd>
5552</dl>
5553</div>
5554</div>
5555<div class="section">
5556<div class="titlepage"><div><div><h6 class="title">
5557<a name="thread.synchronization.other_locks.externally_locked.externally_locked.get2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get2" title="get(nested_strict_lock&lt;Lock&gt;&amp;)"><code class="computeroutput"><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></code></a>
5558</h6></div></div></div>
5559<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>
5560<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>
5561<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>
5562<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>
5563</pre>
5564<div class="variablelist">
5565<p class="title"><b></b></p>
5566<dl class="variablelist">
5567<dt><span class="term">Requires:</span></dt>
5568<dd><p>
5569                    <code class="computeroutput"><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">,</span>
5570                    <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">&gt;</span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5571                    parameter must be locking the associated mutex.
5572                  </p></dd>
5573<dt><span class="term">Returns:</span></dt>
5574<dd><p>
5575                    A reference to the cloaked object
5576                  </p></dd>
5577<dt><span class="term">Throws:</span></dt>
5578<dd><p>
5579                    <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5580                    <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5581                    is defined and the run-time preconditions are not satisfied .
5582                  </p></dd>
5583</dl>
5584</div>
5585</div>
5586<div class="section">
5587<div class="titlepage"><div><div><h6 class="title">
5588<a name="thread.synchronization.other_locks.externally_locked.externally_locked.get3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked.get3" title="get(Lock&amp;)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;)</span></code></a>
5589</h6></div></div></div>
5590<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>
5591<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>
5592<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>
5593<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>
5594</pre>
5595<div class="variablelist">
5596<p class="title"><b></b></p>
5597<dl class="variablelist">
5598<dt><span class="term">Requires:</span></dt>
5599<dd><p>
5600                    <code class="computeroutput"><span class="identifier">Lock</span></code> is a model
5601                    of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>, <code class="computeroutput"><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">,</span>
5602                    <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">&gt;</span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5603                    parameter must be locking the associated mutex.
5604                  </p></dd>
5605<dt><span class="term">Returns:</span></dt>
5606<dd><p>
5607                    A reference to the cloaked object
5608                  </p></dd>
5609<dt><span class="term">Throws:</span></dt>
5610<dd><p>
5611                    <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5612                    <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5613                    is defined and the run-time preconditions are not satisfied .
5614                  </p></dd>
5615</dl>
5616</div>
5617</div>
5618</div>
5619<div class="section">
5620<div class="titlepage"><div><div><h5 class="title">
5621<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref" title="Template Class externally_locked&lt;T&amp;&gt;">Template
5622          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>
5623</h5></div></div></div>
5624<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/externally_locked.hpp&gt;</span>
5625
5626<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>
5627<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>
5628<span class="special">{</span>
5629  <span class="comment">//BOOST_CONCEPT_ASSERT(( CopyConstructible&lt;T&gt; ));</span>
5630  <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>
5631
5632<span class="keyword">public</span><span class="special">:</span>
5633  <span class="keyword">typedef</span> <span class="identifier">MutexType</span> <span class="identifier">mutex_type</span><span class="special">;</span>
5634
5635  <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&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>
5636  <span class="keyword">explicit</span> <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">mutex_type</span><span class="special">&amp;</span> <span class="identifier">mtx</span><span class="special">);</span>
5637  <span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span> <span class="keyword">const</span><span class="special">&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">(</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>
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="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>
5640  <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>
5641
5642  <span class="comment">// observers</span>
5643  <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>
5644  <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>
5645
5646  <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>
5647  <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>
5648  <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>
5649  <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>
5650
5651  <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>
5652  <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>
5653  <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>
5654  <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>
5655
5656 <span class="identifier">mutex_type</span><span class="special">*</span> <span class="identifier">mutex</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
5657
5658  <span class="comment">// modifiers</span>
5659  <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
5660  <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
5661  <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
5662  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5663<span class="special">};</span>
5664</pre>
5665<p>
5666            <code class="computeroutput"><span class="identifier">externally_locked</span></code> is
5667            a model of <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a>, it cloaks an object
5668            of type <code class="computeroutput"><span class="identifier">T</span></code>, and actually
5669            provides full access to that object through the get and set member functions,
5670            provided you pass a reference to a strict lock object.
5671          </p>
5672<p>
5673            Only the specificities respect to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> are described here.
5674          </p>
5675<div class="section">
5676<div class="titlepage"><div><div><h6 class="title">
5677<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor1" title="externally_locked&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>
5678            <span class="identifier">T</span><span class="special">&amp;)</span></code></a>
5679</h6></div></div></div>
5680<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>
5681</pre>
5682<div class="variablelist">
5683<p class="title"><b></b></p>
5684<dl class="variablelist">
5685<dt><span class="term">Effects:</span></dt>
5686<dd><p>
5687                    Constructs an externally locked object copying the cloaked reference.
5688                  </p></dd>
5689</dl>
5690</div>
5691</div>
5692<div class="section">
5693<div class="titlepage"><div><div><h6 class="title">
5694<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.constructor4" title="externally_locked&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>
5695</h6></div></div></div>
5696<pre class="programlisting"><span class="identifier">externally_locked</span><span class="special">(</span><span class="identifier">externally_locked</span><span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
5697</pre>
5698<div class="variablelist">
5699<p class="title"><b></b></p>
5700<dl class="variablelist">
5701<dt><span class="term">Effects:</span></dt>
5702<dd><p>
5703                    Moves an externally locked object by moving the cloaked type
5704                    and copying the mutex reference
5705                  </p></dd>
5706</dl>
5707</div>
5708</div>
5709<div class="section">
5710<div class="titlepage"><div><div><h6 class="title">
5711<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign4"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign4" title="externally_locked(externally_locked&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>
5712</h6></div></div></div>
5713<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>
5714</pre>
5715<div class="variablelist">
5716<p class="title"><b></b></p>
5717<dl class="variablelist">
5718<dt><span class="term">Effects:</span></dt>
5719<dd><p>
5720                    Move assigns an externally locked object by copying the cloaked
5721                    reference and copying the mutex reference
5722                  </p></dd>
5723</dl>
5724</div>
5725</div>
5726<div class="section">
5727<div class="titlepage"><div><div><h6 class="title">
5728<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign5"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.assign5" title="externally_locked(externally_locked&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>
5729</h6></div></div></div>
5730<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>
5731</pre>
5732<div class="variablelist">
5733<p class="title"><b></b></p>
5734<dl class="variablelist">
5735<dt><span class="term">Requires:</span></dt>
5736<dd><p>
5737                    T is a model of Copyable.
5738                  </p></dd>
5739<dt><span class="term">Effects:</span></dt>
5740<dd><p>
5741                    Copy assigns an externally locked object by copying the cloaked
5742                    reference and copying the mutex reference
5743                  </p></dd>
5744<dt><span class="term">Throws:</span></dt>
5745<dd><p>
5746                    Any exception thrown by the call to <code class="computeroutput"><span class="identifier">T</span><span class="special">::</span><span class="keyword">operator</span><span class="special">=(</span><span class="identifier">T</span><span class="special">&amp;)</span></code>.
5747                  </p></dd>
5748</dl>
5749</div>
5750</div>
5751<div class="section">
5752<div class="titlepage"><div><div><h6 class="title">
5753<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get1"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get1" title="get(strict_lock&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>
5754</h6></div></div></div>
5755<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>
5756<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>
5757</pre>
5758<div class="variablelist">
5759<p class="title"><b></b></p>
5760<dl class="variablelist">
5761<dt><span class="term">Requires:</span></dt>
5762<dd><p>
5763                    The <code class="computeroutput"><span class="identifier">lk</span></code> parameter
5764                    must be locking the associated mutex.
5765                  </p></dd>
5766<dt><span class="term">Returns:</span></dt>
5767<dd><p>
5768                    A reference to the cloaked object
5769                  </p></dd>
5770<dt><span class="term">Throws:</span></dt>
5771<dd><p>
5772                    <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5773                    <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5774                    is defined and the run-time preconditions are not satisfied .
5775                  </p></dd>
5776</dl>
5777</div>
5778</div>
5779<div class="section">
5780<div class="titlepage"><div><div><h6 class="title">
5781<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get2"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get2" title="get(nested_strict_lock&lt;Lock&gt;&amp;)"><code class="computeroutput"><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></code></a>
5782</h6></div></div></div>
5783<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>
5784<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>
5785<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>
5786<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>
5787</pre>
5788<div class="variablelist">
5789<p class="title"><b></b></p>
5790<dl class="variablelist">
5791<dt><span class="term">Requires:</span></dt>
5792<dd><p>
5793                    <code class="computeroutput"><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">,</span>
5794                    <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">&gt;</span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5795                    parameter must be locking the associated mutex.
5796                  </p></dd>
5797<dt><span class="term">Returns:</span></dt>
5798<dd><p>
5799                    A reference to the cloaked object
5800                  </p></dd>
5801<dt><span class="term">Throws:</span></dt>
5802<dd><p>
5803                    <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5804                    <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5805                    is defined and the run-time preconditions are not satisfied .
5806                  </p></dd>
5807</dl>
5808</div>
5809</div>
5810<div class="section">
5811<div class="titlepage"><div><div><h6 class="title">
5812<a name="thread.synchronization.other_locks.externally_locked.externally_locked_ref.get3"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.externally_locked_ref.get3" title="get(Lock&amp;)"><code class="computeroutput"><span class="identifier">get</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;)</span></code></a>
5813</h6></div></div></div>
5814<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>
5815<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>
5816<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>
5817<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>
5818</pre>
5819<div class="variablelist">
5820<p class="title"><b></b></p>
5821<dl class="variablelist">
5822<dt><span class="term">Requires:</span></dt>
5823<dd><p>
5824                    <code class="computeroutput"><span class="identifier">Lock</span></code> is a model
5825                    of <a class="link" href="synchronization.html#thread.synchronization.lock_concepts.StrictLock" title="StrictLock -- EXTENSION"><code class="computeroutput"><span class="identifier">StrictLock</span></code></a>, <code class="computeroutput"><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">mutex_type</span><span class="special">,</span>
5826                    <span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">::</span><span class="identifier">mutex_type</span><span class="special">&gt;</span></code> and the <code class="computeroutput"><span class="identifier">lk</span></code>
5827                    parameter must be locking the associated mutex.
5828                  </p></dd>
5829<dt><span class="term">Returns:</span></dt>
5830<dd><p>
5831                    A reference to the cloaked object
5832                  </p></dd>
5833<dt><span class="term">Throws:</span></dt>
5834<dd><p>
5835                    <code class="computeroutput"><span class="identifier">lock_error</span></code> if
5836                    <code class="computeroutput"><span class="identifier">BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED</span></code>
5837                    is defined and the run-time preconditions are not satisfied .
5838                  </p></dd>
5839</dl>
5840</div>
5841</div>
5842</div>
5843<div class="section">
5844<div class="titlepage"><div><div><h5 class="title">
5845<a name="thread.synchronization.other_locks.externally_locked.swap"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.externally_locked.swap" title="swap(externally_locked&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>
5846          <span class="identifier">externally_locked</span><span class="special">&amp;)</span></code></a>
5847</h5></div></div></div>
5848<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>
5849<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>
5850</pre>
5851</div>
5852</div>
5853<div class="section">
5854<div class="titlepage"><div><div><h4 class="title">
5855<a name="thread.synchronization.other_locks.shared_lock_guard"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard">Class
5856        template <code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a>
5857</h4></div></div></div>
5858<div class="toc"><dl class="toc">
5859<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&amp;</span>
5860          <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
5861<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor_adopt"><code class="computeroutput"><span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&amp;</span>
5862          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a></span></dt>
5863<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">()</span></code></a></span></dt>
5864</dl></div>
5865<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/shared_lock_guard.hpp&gt;</span>
5866<span class="keyword">namespace</span> <span class="identifier">boost</span>
5867<span class="special">{</span>
5868  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">SharedLockable</span><span class="special">&gt;</span>
5869  <span class="keyword">class</span> <span class="identifier">shared_lock_guard</span>
5870  <span class="special">{</span>
5871  <span class="keyword">public</span><span class="special">:</span>
5872      <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">shared_lock_guard</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5873      <span class="identifier">shared_lock_guard</span><span class="special">&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>
5874
5875      <span class="keyword">explicit</span> <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
5876      <span class="identifier">shared_lock_guard</span><span class="special">(</span><span class="identifier">SharedLockable</span><span class="special">&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>
5877
5878      <span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">();</span>
5879  <span class="special">};</span>
5880<span class="special">}</span>
5881</pre>
5882<p>
5883          <a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard"><code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a> is very simple:
5884          on construction it acquires shared ownership of the implementation of the
5885          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a> supplied
5886          as the constructor parameter. On destruction, the ownership is released.
5887          This provides simple RAII-style locking of a <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> object, to facilitate
5888          exception-safe shared locking and unlocking. In addition, the <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard" title="Class template shared_lock_guard"><code class="computeroutput"><span class="identifier">shared_lock_guard</span></code></a><span class="special">(</span><span class="identifier">SharedLockable</span> <span class="special">&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
5889          shared ownership of a lock already held by the current thread.
5890        </p>
5891<div class="section">
5892<div class="titlepage"><div><div><h5 class="title">
5893<a name="thread.synchronization.other_locks.shared_lock_guard.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor" title="shared_lock_guard(SharedLockable &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>
5894          <span class="identifier">m</span><span class="special">)</span></code></a>
5895</h5></div></div></div>
5896<div class="variablelist">
5897<p class="title"><b></b></p>
5898<dl class="variablelist">
5899<dt><span class="term">Effects:</span></dt>
5900<dd><p>
5901                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
5902                  Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>.
5903                </p></dd>
5904<dt><span class="term">Throws:</span></dt>
5905<dd><p>
5906                  Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>.
5907                </p></dd>
5908</dl>
5909</div>
5910</div>
5911<div class="section">
5912<div class="titlepage"><div><div><h5 class="title">
5913<a name="thread.synchronization.other_locks.shared_lock_guard.constructor_adopt"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.constructor_adopt" title="shared_lock_guard(SharedLockable &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>
5914          <span class="identifier">m</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">adopt_lock_t</span><span class="special">)</span></code></a>
5915</h5></div></div></div>
5916<div class="variablelist">
5917<p class="title"><b></b></p>
5918<dl class="variablelist">
5919<dt><span class="term">Precondition:</span></dt>
5920<dd><p>
5921                  The current thread owns a lock on <code class="computeroutput"><span class="identifier">m</span></code>
5922                  equivalent to one obtained by a call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code>.
5923                </p></dd>
5924<dt><span class="term">Effects:</span></dt>
5925<dd><p>
5926                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
5927                  Takes ownership of the lock state of <code class="computeroutput"><span class="identifier">m</span></code>.
5928                </p></dd>
5929<dt><span class="term">Throws:</span></dt>
5930<dd><p>
5931                  Nothing.
5932                </p></dd>
5933</dl>
5934</div>
5935</div>
5936<div class="section">
5937<div class="titlepage"><div><div><h5 class="title">
5938<a name="thread.synchronization.other_locks.shared_lock_guard.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.shared_lock_guard.destructor" title="~shared_lock_guard()"><code class="computeroutput"><span class="special">~</span><span class="identifier">shared_lock_guard</span><span class="special">()</span></code></a>
5939</h5></div></div></div>
5940<div class="variablelist">
5941<p class="title"><b></b></p>
5942<dl class="variablelist">
5943<dt><span class="term">Effects:</span></dt>
5944<dd><p>
5945                  Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.unlock_shared" title="m.unlock_shared()"><code class="computeroutput"><span class="identifier">unlock_shared</span><span class="special">()</span></code></a><span class="special">()</span></code> on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code></a> object
5946                  passed to the constructor.
5947                </p></dd>
5948<dt><span class="term">Throws:</span></dt>
5949<dd><p>
5950                  Nothing.
5951                </p></dd>
5952</dl>
5953</div>
5954</div>
5955</div>
5956<div class="section">
5957<div class="titlepage"><div><div><h4 class="title">
5958<a name="thread.synchronization.other_locks.reverse_lock"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock">Class
5959        template <code class="computeroutput"><span class="identifier">reverse_lock</span></code></a>
5960</h4></div></div></div>
5961<div class="toc"><dl class="toc">
5962<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock.constructor"><code class="computeroutput"><span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span> <span class="special">&amp;</span>
5963          <span class="identifier">m</span><span class="special">)</span></code></a></span></dt>
5964<dt><span class="section"><a href="synchronization.html#thread.synchronization.other_locks.reverse_lock.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">()</span></code></a></span></dt>
5965</dl></div>
5966<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/reverse_lock.hpp&gt;</span>
5967<span class="keyword">namespace</span> <span class="identifier">boost</span>
5968<span class="special">{</span>
5969
5970  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lock</span><span class="special">&gt;</span>
5971  <span class="keyword">class</span> <span class="identifier">reverse_lock</span>
5972  <span class="special">{</span>
5973  <span class="keyword">public</span><span class="special">:</span>
5974      <span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">reverse_lock</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
5975      <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>
5976
5977      <span class="keyword">explicit</span> <span class="identifier">reverse_lock</span><span class="special">(</span><span class="identifier">Lock</span><span class="special">&amp;</span> <span class="identifier">m_</span><span class="special">);</span>
5978      <span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">();</span>
5979  <span class="special">};</span>
5980<span class="special">}</span>
5981</pre>
5982<p>
5983          <a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock"><code class="computeroutput"><span class="identifier">reverse_lock</span></code></a> reverse the operations
5984          of a lock: it provide for RAII-style, that unlocks the lock at construction
5985          time and lock it at destruction time. In addition, it transfer ownership
5986          temporarily, so that the mutex can not be locked using the Lock.
5987        </p>
5988<p>
5989          An instance of <a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock" title="Class template reverse_lock"><code class="computeroutput"><span class="identifier">reverse_lock</span></code></a> doesn't <span class="emphasis"><em>own</em></span>
5990          the lock never.
5991        </p>
5992<div class="section">
5993<div class="titlepage"><div><div><h5 class="title">
5994<a name="thread.synchronization.other_locks.reverse_lock.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock.constructor" title="reverse_lock(Lock &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>
5995          <span class="identifier">m</span><span class="special">)</span></code></a>
5996</h5></div></div></div>
5997<div class="variablelist">
5998<p class="title"><b></b></p>
5999<dl class="variablelist">
6000<dt><span class="term">Effects:</span></dt>
6001<dd><p>
6002                  Stores a reference to <code class="computeroutput"><span class="identifier">m</span></code>.
6003                  Invokes <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>
6004                  if <code class="computeroutput"><span class="identifier">m</span></code> owns his lock
6005                  and then stores the mutex by calling <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><span class="identifier">release</span><span class="special">()</span></code>.
6006                </p></dd>
6007<dt><span class="term">Postcondition:</span></dt>
6008<dd><p>
6009                  <code class="computeroutput"><span class="special">!</span><span class="identifier">m</span><span class="special">.</span> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock.owns_lock" title="bool owns_lock() const"><code class="computeroutput"><span class="identifier">owns_lock</span><span class="special">()</span></code></a><span class="special">()</span> <span class="special">&amp;&amp;</span>
6010                  <span class="identifier">m</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()==</span><span class="number">0</span></code>.
6011                </p></dd>
6012<dt><span class="term">Throws:</span></dt>
6013<dd><p>
6014                  Any exception thrown by the call to <code class="computeroutput"><span class="identifier">m</span><span class="special">.</span><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span></code></a><span class="special">()</span></code>.
6015                </p></dd>
6016</dl>
6017</div>
6018</div>
6019<div class="section">
6020<div class="titlepage"><div><div><h5 class="title">
6021<a name="thread.synchronization.other_locks.reverse_lock.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.other_locks.reverse_lock.destructor" title="~reverse_lock()"><code class="computeroutput"><span class="special">~</span><span class="identifier">reverse_lock</span><span class="special">()</span></code></a>
6022</h5></div></div></div>
6023<div class="variablelist">
6024<p class="title"><b></b></p>
6025<dl class="variablelist">
6026<dt><span class="term">Effects:</span></dt>
6027<dd><p>
6028                  Let be mtx the stored mutex*. If not 0 Invokes <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-&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>
6029                  and gives again the <code class="computeroutput"><span class="identifier">mtx</span></code>
6030                  to the <code class="computeroutput"><span class="identifier">Lock</span></code> using
6031                  the <code class="computeroutput"><span class="identifier">adopt_lock_t</span></code>
6032                  overload.
6033                </p></dd>
6034<dt><span class="term">Throws:</span></dt>
6035<dd><p>
6036                  Any exception thrown by <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-&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>.
6037                </p></dd>
6038<dt><span class="term">Remarks:</span></dt>
6039<dd><p>
6040                  Note that if <code class="computeroutput"><span class="identifier">mtx</span><span class="special">-&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>
6041                  throws an exception while unwinding the program will terminate,
6042                  so don't use reverse_lock if an exception can be thrown.
6043                </p></dd>
6044</dl>
6045</div>
6046</div>
6047</div>
6048</div>
6049<div class="section">
6050<div class="titlepage"><div><div><h3 class="title">
6051<a name="thread.synchronization.lock_functions"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions" title="Lock functions">Lock functions</a>
6052</h3></div></div></div>
6053<div class="toc"><dl class="toc">
6054<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.lock_multiple">Non-member
6055        function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a></span></dt>
6056<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.lock_range">Non-member
6057        function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> //
6058        EXTENSION</a></span></dt>
6059<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.try_lock_multiple">Non-member
6060        function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a></span></dt>
6061<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_functions.try_lock_range">Non-member
6062        function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> //
6063        EXTENSION</a></span></dt>
6064</dl></div>
6065<div class="section">
6066<div class="titlepage"><div><div><h4 class="title">
6067<a name="thread.synchronization.lock_functions.lock_multiple"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.lock_multiple" title="Non-member function lock(Lockable1,Lockable2,...)">Non-member
6068        function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a>
6069</h4></div></div></div>
6070<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/locks.hpp&gt;</span>
6071<span class="comment">// #include &lt;boost/thread/lock_algorithms.hpp&gt;</span>
6072<span class="keyword">namespace</span> <span class="identifier">boost</span>
6073<span class="special">{</span>
6074
6075  <span class="keyword">template</span><span class="special">&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>
6076  <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>
6077
6078  <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>
6079  <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>
6080
6081  <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>
6082  <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>
6083
6084  <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>
6085  <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>
6086
6087<span class="special">}</span>
6088</pre>
6089<div class="variablelist">
6090<p class="title"><b></b></p>
6091<dl class="variablelist">
6092<dt><span class="term">Effects:</span></dt>
6093<dd><p>
6094                Locks the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects supplied
6095                as arguments in an unspecified and indeterminate order in a way that
6096                avoids deadlock. It is safe to call this function concurrently from
6097                multiple threads for any set of mutexes (or other lockable objects)
6098                in any order without risk of deadlock. If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6099                or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6100                operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws
6101                an exception any locks acquired by the function will be released
6102                before the function exits.
6103              </p></dd>
6104<dt><span class="term">Throws:</span></dt>
6105<dd><p>
6106                Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6107                or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6108                on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects.
6109              </p></dd>
6110<dt><span class="term">Postcondition:</span></dt>
6111<dd><p>
6112                All the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are locked
6113                by the calling thread.
6114              </p></dd>
6115</dl>
6116</div>
6117</div>
6118<div class="section">
6119<div class="titlepage"><div><div><h4 class="title">
6120<a name="thread.synchronization.lock_functions.lock_range"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.lock_range" title="Non-member function lock(begin,end) // EXTENSION">Non-member
6121        function <code class="computeroutput"><span class="identifier">lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> //
6122        EXTENSION</a>
6123</h4></div></div></div>
6124<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">&gt;</span>
6125<span class="keyword">void</span> <span class="identifier">lock</span><span class="special">(</span><span class="identifier">ForwardIterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">ForwardIterator</span> <span class="identifier">end</span><span class="special">);</span>
6126</pre>
6127<div class="variablelist">
6128<p class="title"><b></b></p>
6129<dl class="variablelist">
6130<dt><span class="term">Preconditions:</span></dt>
6131<dd><p>
6132                The <code class="computeroutput"><span class="identifier">value_type</span></code> of
6133                <code class="computeroutput"><span class="identifier">ForwardIterator</span></code> must
6134                implement the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>
6135              </p></dd>
6136<dt><span class="term">Effects:</span></dt>
6137<dd><p>
6138                Locks all the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6139                supplied range in an unspecified and indeterminate order in a way
6140                that avoids deadlock. It is safe to call this function concurrently
6141                from multiple threads for any set of mutexes (or other lockable objects)
6142                in any order without risk of deadlock. If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6143                or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6144                operations on the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6145                supplied range throws an exception any locks acquired by the function
6146                will be released before the function exits.
6147              </p></dd>
6148<dt><span class="term">Throws:</span></dt>
6149<dd><p>
6150                Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6151                or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6152                on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects.
6153              </p></dd>
6154<dt><span class="term">Postcondition:</span></dt>
6155<dd><p>
6156                All the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6157                supplied range are locked by the calling thread.
6158              </p></dd>
6159</dl>
6160</div>
6161</div>
6162<div class="section">
6163<div class="titlepage"><div><div><h4 class="title">
6164<a name="thread.synchronization.lock_functions.try_lock_multiple"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.try_lock_multiple" title="Non-member function try_lock(Lockable1,Lockable2,...)">Non-member
6165        function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">Lockable1</span><span class="special">,</span><span class="identifier">Lockable2</span><span class="special">,...)</span></code></a>
6166</h4></div></div></div>
6167<pre class="programlisting"><span class="keyword">template</span><span class="special">&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>
6168<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>
6169
6170<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>
6171<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>
6172
6173<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>
6174<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>
6175
6176<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>
6177<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>
6178</pre>
6179<div class="variablelist">
6180<p class="title"><b></b></p>
6181<dl class="variablelist">
6182<dt><span class="term">Effects:</span></dt>
6183<dd>
6184<p>
6185                Calls <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6186                on each of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects supplied
6187                as arguments. If any of the calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6188                returns <code class="computeroutput"><span class="keyword">false</span></code> then all
6189                locks acquired are released and the zero-based index of the failed
6190                lock is returned.
6191              </p>
6192<p>
6193                If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6194                operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws
6195                an exception any locks acquired by the function will be released
6196                before the function exits.
6197              </p>
6198</dd>
6199<dt><span class="term">Returns:</span></dt>
6200<dd><p>
6201                <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>
6202                if all the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are now
6203                locked by the calling thread, the zero-based index of the object
6204                which could not be locked otherwise.
6205              </p></dd>
6206<dt><span class="term">Throws:</span></dt>
6207<dd><p>
6208                Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6209                on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects.
6210              </p></dd>
6211<dt><span class="term">Postcondition:</span></dt>
6212<dd><p>
6213                If the function returns <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>, all the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are locked
6214                by the calling thread. Otherwise any locks acquired by this function
6215                will have been released.
6216              </p></dd>
6217</dl>
6218</div>
6219</div>
6220<div class="section">
6221<div class="titlepage"><div><div><h4 class="title">
6222<a name="thread.synchronization.lock_functions.try_lock_range"></a><a class="link" href="synchronization.html#thread.synchronization.lock_functions.try_lock_range" title="Non-member function try_lock(begin,end) // EXTENSION">Non-member
6223        function <code class="computeroutput"><span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span><span class="identifier">end</span><span class="special">)</span></code> //
6224        EXTENSION</a>
6225</h4></div></div></div>
6226<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ForwardIterator</span><span class="special">&gt;</span>
6227<span class="identifier">ForwardIterator</span> <span class="identifier">try_lock</span><span class="special">(</span><span class="identifier">ForwardIterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">ForwardIterator</span> <span class="identifier">end</span><span class="special">);</span>
6228</pre>
6229<div class="variablelist">
6230<p class="title"><b></b></p>
6231<dl class="variablelist">
6232<dt><span class="term">Preconditions:</span></dt>
6233<dd><p>
6234                The <code class="computeroutput"><span class="identifier">value_type</span></code> of
6235                <code class="computeroutput"><span class="identifier">ForwardIterator</span></code> must
6236                implement the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a>
6237              </p></dd>
6238<dt><span class="term">Effects:</span></dt>
6239<dd>
6240<p>
6241                Calls <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6242                on each of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6243                supplied range. If any of the calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6244                returns <code class="computeroutput"><span class="keyword">false</span></code> then all
6245                locks acquired are released and an iterator referencing the failed
6246                lock is returned.
6247              </p>
6248<p>
6249                If any of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6250                operations on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects throws
6251                an exception any locks acquired by the function will be released
6252                before the function exits.
6253              </p>
6254</dd>
6255<dt><span class="term">Returns:</span></dt>
6256<dd><p>
6257                <code class="computeroutput"><span class="identifier">end</span></code> if all the supplied
6258                <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects are now
6259                locked by the calling thread, an iterator referencing the object
6260                which could not be locked otherwise.
6261              </p></dd>
6262<dt><span class="term">Throws:</span></dt>
6263<dd><p>
6264                Any exceptions thrown by calling <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6265                on the supplied <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects.
6266              </p></dd>
6267<dt><span class="term">Postcondition:</span></dt>
6268<dd><p>
6269                If the function returns <code class="computeroutput"><span class="identifier">end</span></code>
6270                then all the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code></a> objects in the
6271                supplied range are locked by the calling thread, otherwise all locks
6272                acquired by the function have been released.
6273              </p></dd>
6274</dl>
6275</div>
6276</div>
6277</div>
6278<div class="section">
6279<div class="titlepage"><div><div><h3 class="title">
6280<a name="thread.synchronization.lock_factories"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories" title="Lock Factories - EXTENSION">Lock Factories
6281      - EXTENSION</a>
6282</h3></div></div></div>
6283<div class="toc"><dl class="toc">
6284<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock">Non
6285        Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;)</span></code></a></span></dt>
6286<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock_t">Non
6287        Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;,</span><span class="identifier">tag</span><span class="special">)</span></code></a></span></dt>
6288<dt><span class="section"><a href="synchronization.html#thread.synchronization.lock_factories.make_unique_locks">Non
6289        Member Function <code class="computeroutput"><span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="special">...)</span></code></a></span></dt>
6290</dl></div>
6291<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span>
6292<span class="special">{</span>
6293
6294  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6295  <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>
6296
6297  <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>
6298  <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>
6299  <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>
6300  <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>
6301  <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>
6302  <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>
6303
6304<span class="preprocessor">#if</span> <span class="special">!</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_NO_MAKE_UNIQUE_LOCKS</span><span class="special">)</span>
6305  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Lockable</span><span class="special">&gt;</span>
6306  <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>
6307<span class="preprocessor">#endif</span>
6308<span class="special">}</span>
6309</pre>
6310<div class="section">
6311<div class="titlepage"><div><div><h4 class="title">
6312<a name="thread.synchronization.lock_factories.make_unique_lock"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock" title="Non Member Function make_unique_lock(Lockable&amp;)">Non
6313        Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;)</span></code></a>
6314</h4></div></div></div>
6315<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>
6316<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>
6317</pre>
6318<div class="variablelist">
6319<p class="title"><b></b></p>
6320<dl class="variablelist">
6321<dt><span class="term">Returns:</span></dt>
6322<dd><p>
6323                a <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> as if initialized
6324                with <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;(</span><span class="identifier">mtx</span><span class="special">)</span></code>.
6325              </p></dd>
6326<dt><span class="term">Throws:</span></dt>
6327<dd><p>
6328                Any exception thrown by the call to <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;(</span><span class="identifier">mtx</span><span class="special">)</span></code>.
6329              </p></dd>
6330</dl>
6331</div>
6332</div>
6333<div class="section">
6334<div class="titlepage"><div><div><h4 class="title">
6335<a name="thread.synchronization.lock_factories.make_unique_lock_t"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_lock_t" title="Non Member Function make_unique_lock(Lockable&amp;,tag)">Non
6336        Member Function <code class="computeroutput"><span class="identifier">make_unique_lock</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;,</span><span class="identifier">tag</span><span class="special">)</span></code></a>
6337</h4></div></div></div>
6338<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lockable</span><span class="special">&gt;</span>
6339<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>
6340
6341<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>
6342<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>
6343
6344<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>
6345<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>
6346</pre>
6347<div class="variablelist">
6348<p class="title"><b></b></p>
6349<dl class="variablelist">
6350<dt><span class="term">Returns:</span></dt>
6351<dd><p>
6352                a <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> as if initialized
6353                with <code class="computeroutput"><span class="identifier">unique_lock</span><span class="special">&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>.
6354              </p></dd>
6355<dt><span class="term">Throws:</span></dt>
6356<dd><p>
6357                Any exception thrown by the call to <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a><span class="special">&lt;</span><span class="identifier">Lockable</span><span class="special">&gt;(</span><span class="identifier">mtx</span><span class="special">,</span>
6358                <span class="identifier">tag</span><span class="special">)</span></code>.
6359              </p></dd>
6360</dl>
6361</div>
6362</div>
6363<div class="section">
6364<div class="titlepage"><div><div><h4 class="title">
6365<a name="thread.synchronization.lock_factories.make_unique_locks"></a><a class="link" href="synchronization.html#thread.synchronization.lock_factories.make_unique_locks" title="Non Member Function make_unique_locks(Lockable&amp; ...)">Non
6366        Member Function <code class="computeroutput"><span class="identifier">make_unique_locks</span><span class="special">(</span><span class="identifier">Lockable</span><span class="special">&amp;</span> <span class="special">...)</span></code></a>
6367</h4></div></div></div>
6368<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>
6369<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>
6370</pre>
6371<div class="variablelist">
6372<p class="title"><b></b></p>
6373<dl class="variablelist">
6374<dt><span class="term">Effect:</span></dt>
6375<dd><p>
6376                Locks all the mutexes.
6377              </p></dd>
6378<dt><span class="term">Returns:</span></dt>
6379<dd><p>
6380                a std::tuple of unique <a class="link" href="synchronization.html#thread.synchronization.locks.unique_lock" title="Class template unique_lock"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span></code></a> owning each
6381                one of the mutex.
6382              </p></dd>
6383<dt><span class="term">Throws:</span></dt>
6384<dd><p>
6385                Any exception thrown by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock</span><span class="special">(</span><span class="identifier">mtx</span><span class="special">...)</span></code>.
6386              </p></dd>
6387</dl>
6388</div>
6389</div>
6390</div>
6391<div class="section">
6392<div class="titlepage"><div><div><h3 class="title">
6393<a name="thread.synchronization.mutex_types"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types" title="Mutex Types">Mutex Types</a>
6394</h3></div></div></div>
6395<div class="toc"><dl class="toc">
6396<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.mutex">Class <code class="computeroutput"><span class="identifier">mutex</span></code></a></span></dt>
6397<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.try_mutex">Typedef
6398        <code class="computeroutput"><span class="identifier">try_mutex</span></code></a></span></dt>
6399<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.timed_mutex">Class
6400        <code class="computeroutput"><span class="identifier">timed_mutex</span></code></a></span></dt>
6401<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex">Class
6402        <code class="computeroutput"><span class="identifier">recursive_mutex</span></code></a></span></dt>
6403<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex">Typedef
6404        <code class="computeroutput"><span class="identifier">recursive_try_mutex</span></code></a></span></dt>
6405<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex">Class
6406        <code class="computeroutput"><span class="identifier">recursive_timed_mutex</span></code></a></span></dt>
6407<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.shared_mutex">Class
6408        <code class="computeroutput"><span class="identifier">shared_mutex</span></code> -- C++14</a></span></dt>
6409<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.upgrade_mutex">Class
6410        <code class="computeroutput"><span class="identifier">upgrade_mutex</span></code> -- EXTENSION</a></span></dt>
6411<dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.null_mutex">Class
6412        <code class="computeroutput"><span class="identifier">null_mutex</span></code> -- EXTENSION</a></span></dt>
6413</dl></div>
6414<div class="section">
6415<div class="titlepage"><div><div><h4 class="title">
6416<a name="thread.synchronization.mutex_types.mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex">Class <code class="computeroutput"><span class="identifier">mutex</span></code></a>
6417</h4></div></div></div>
6418<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.mutex.nativehandle">Member
6419          function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6420<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6421
6422<span class="keyword">class</span> <span class="identifier">mutex</span><span class="special">:</span>
6423    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6424<span class="special">{</span>
6425<span class="keyword">public</span><span class="special">:</span>
6426    <span class="identifier">mutex</span><span class="special">();</span>
6427    <span class="special">~</span><span class="identifier">mutex</span><span class="special">();</span>
6428
6429    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6430    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6431    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6432
6433    <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6434    <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6435
6436    <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6437    <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span>
6438<span class="special">};</span>
6439</pre>
6440<p>
6441          <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a> implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to provide an
6442          exclusive-ownership mutex. At most one thread can own the lock on a given
6443          instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a> at any time. Multiple concurrent
6444          calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6445          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6446          and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6447          shall be permitted.
6448        </p>
6449<div class="section">
6450<div class="titlepage"><div><div><h5 class="title">
6451<a name="thread.synchronization.mutex_types.mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex.nativehandle" title="Member function native_handle()">Member
6452          function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6453</h5></div></div></div>
6454<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6455<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6456</pre>
6457<div class="variablelist">
6458<p class="title"><b></b></p>
6459<dl class="variablelist">
6460<dt><span class="term">Effects:</span></dt>
6461<dd><p>
6462                  Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6463                  that can be used with platform-specific APIs to manipulate the
6464                  underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6465                  and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6466                  are not present.
6467                </p></dd>
6468<dt><span class="term">Throws:</span></dt>
6469<dd><p>
6470                  Nothing.
6471                </p></dd>
6472</dl>
6473</div>
6474</div>
6475</div>
6476<div class="section">
6477<div class="titlepage"><div><div><h4 class="title">
6478<a name="thread.synchronization.mutex_types.try_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.try_mutex" title="Typedef try_mutex">Typedef
6479        <code class="computeroutput"><span class="identifier">try_mutex</span></code></a>
6480</h4></div></div></div>
6481<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6482
6483<span class="keyword">typedef</span> <span class="identifier">mutex</span> <span class="identifier">try_mutex</span><span class="special">;</span>
6484</pre>
6485<p>
6486          <a class="link" href="synchronization.html#thread.synchronization.mutex_types.try_mutex" title="Typedef try_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">try_mutex</span></code></a> is a <code class="computeroutput"><span class="keyword">typedef</span></code>
6487          to <a class="link" href="synchronization.html#thread.synchronization.mutex_types.mutex" title="Class mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span></code></a>, provided for backwards
6488          compatibility with previous releases of boost.
6489        </p>
6490</div>
6491<div class="section">
6492<div class="titlepage"><div><div><h4 class="title">
6493<a name="thread.synchronization.mutex_types.timed_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex">Class
6494        <code class="computeroutput"><span class="identifier">timed_mutex</span></code></a>
6495</h4></div></div></div>
6496<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.timed_mutex.nativehandle">Member
6497          function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6498<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6499
6500<span class="keyword">class</span> <span class="identifier">timed_mutex</span><span class="special">:</span>
6501    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6502<span class="special">{</span>
6503<span class="keyword">public</span><span class="special">:</span>
6504    <span class="identifier">timed_mutex</span><span class="special">();</span>
6505    <span class="special">~</span><span class="identifier">timed_mutex</span><span class="special">();</span>
6506
6507    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6508    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6509    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6510
6511    <span class="keyword">template</span> <span class="special">&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>
6512    <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6513    <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>
6514    <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6515
6516    <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6517    <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6518
6519    <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">timed_mutex</span><span class="special">&gt;</span> <span class="identifier">scoped_timed_lock</span><span class="special">;</span>
6520    <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span>
6521    <span class="keyword">typedef</span> <span class="identifier">scoped_timed_lock</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6522
6523<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
6524    <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6525    <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>
6526    <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">relative_time</span><span class="special">);</span>
6527<span class="preprocessor">#endif</span>
6528
6529<span class="special">};</span>
6530</pre>
6531<p>
6532          <a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span></code></a> implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> to provide
6533          an exclusive-ownership mutex. At most one thread can own the lock on a
6534          given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex" title="Class timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">timed_mutex</span></code></a> at any time. Multiple
6535          concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6536          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
6537          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6538          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
6539          and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6540          shall be permitted.
6541        </p>
6542<div class="section">
6543<div class="titlepage"><div><div><h5 class="title">
6544<a name="thread.synchronization.mutex_types.timed_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.timed_mutex.nativehandle" title="Member function native_handle()">Member
6545          function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6546</h5></div></div></div>
6547<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6548<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6549</pre>
6550<div class="variablelist">
6551<p class="title"><b></b></p>
6552<dl class="variablelist">
6553<dt><span class="term">Effects:</span></dt>
6554<dd><p>
6555                  Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6556                  that can be used with platform-specific APIs to manipulate the
6557                  underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6558                  and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6559                  are not present.
6560                </p></dd>
6561<dt><span class="term">Throws:</span></dt>
6562<dd><p>
6563                  Nothing.
6564                </p></dd>
6565</dl>
6566</div>
6567</div>
6568</div>
6569<div class="section">
6570<div class="titlepage"><div><div><h4 class="title">
6571<a name="thread.synchronization.mutex_types.recursive_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex">Class
6572        <code class="computeroutput"><span class="identifier">recursive_mutex</span></code></a>
6573</h4></div></div></div>
6574<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex.nativehandle">Member
6575          function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6576<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6577
6578<span class="keyword">class</span> <span class="identifier">recursive_mutex</span><span class="special">:</span>
6579    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6580<span class="special">{</span>
6581<span class="keyword">public</span><span class="special">:</span>
6582    <span class="identifier">recursive_mutex</span><span class="special">();</span>
6583    <span class="special">~</span><span class="identifier">recursive_mutex</span><span class="special">();</span>
6584
6585    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6586    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
6587    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6588
6589    <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6590    <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6591
6592    <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">recursive_mutex</span><span class="special">&gt;</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6593    <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span>
6594<span class="special">};</span>
6595</pre>
6596<p>
6597          <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> implements the
6598          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable" title="Lockable Concept"><code class="computeroutput"><span class="identifier">Lockable</span></code> concept</a> to provide an
6599          exclusive-ownership recursive mutex. At most one thread can own the lock
6600          on a given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> at any time. Multiple
6601          concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6602          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6603          and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6604          shall be permitted. A thread that already has exclusive ownership of a
6605          given <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a> instance can call
6606          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>
6607          or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6608          to acquire an additional level of ownership of the mutex. <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6609          must be called once for each level of ownership acquired by a single thread
6610          before ownership can be acquired by another thread.
6611        </p>
6612<div class="section">
6613<div class="titlepage"><div><div><h5 class="title">
6614<a name="thread.synchronization.mutex_types.recursive_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex.nativehandle" title="Member function native_handle()">Member
6615          function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6616</h5></div></div></div>
6617<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6618<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6619</pre>
6620<div class="variablelist">
6621<p class="title"><b></b></p>
6622<dl class="variablelist">
6623<dt><span class="term">Effects:</span></dt>
6624<dd><p>
6625                  Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6626                  that can be used with platform-specific APIs to manipulate the
6627                  underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6628                  and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6629                  are not present.
6630                </p></dd>
6631<dt><span class="term">Throws:</span></dt>
6632<dd><p>
6633                  Nothing.
6634                </p></dd>
6635</dl>
6636</div>
6637</div>
6638</div>
6639<div class="section">
6640<div class="titlepage"><div><div><h4 class="title">
6641<a name="thread.synchronization.mutex_types.recursive_try_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex" title="Typedef recursive_try_mutex">Typedef
6642        <code class="computeroutput"><span class="identifier">recursive_try_mutex</span></code></a>
6643</h4></div></div></div>
6644<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6645
6646<span class="keyword">typedef</span> <span class="identifier">recursive_mutex</span> <span class="identifier">recursive_try_mutex</span><span class="special">;</span>
6647</pre>
6648<p>
6649          <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_try_mutex" title="Typedef recursive_try_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_try_mutex</span></code></a> is a <code class="computeroutput"><span class="keyword">typedef</span></code> to <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_mutex" title="Class recursive_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_mutex</span></code></a>, provided for
6650          backwards compatibility with previous releases of boost.
6651        </p>
6652</div>
6653<div class="section">
6654<div class="titlepage"><div><div><h4 class="title">
6655<a name="thread.synchronization.mutex_types.recursive_timed_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex">Class
6656        <code class="computeroutput"><span class="identifier">recursive_timed_mutex</span></code></a>
6657</h4></div></div></div>
6658<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle">Member
6659          function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a></span></dt></dl></div>
6660<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6661
6662<span class="keyword">class</span> <span class="identifier">recursive_timed_mutex</span><span class="special">:</span>
6663    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
6664<span class="special">{</span>
6665<span class="keyword">public</span><span class="special">:</span>
6666    <span class="identifier">recursive_timed_mutex</span><span class="special">();</span>
6667    <span class="special">~</span><span class="identifier">recursive_timed_mutex</span><span class="special">();</span>
6668
6669    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6670    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
6671    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6672
6673
6674    <span class="keyword">template</span> <span class="special">&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>
6675    <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6676    <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>
6677    <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6678
6679    <span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6680    <span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6681
6682    <span class="keyword">typedef</span> <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">recursive_timed_mutex</span><span class="special">&gt;</span> <span class="identifier">scoped_lock</span><span class="special">;</span>
6683    <span class="keyword">typedef</span> <span class="identifier">unspecified</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">scoped_try_lock</span><span class="special">;</span>
6684    <span class="keyword">typedef</span> <span class="identifier">scoped_lock</span> <span class="identifier">scoped_timed_lock</span><span class="special">;</span>
6685
6686<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
6687    <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">);</span>
6688    <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>
6689    <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">TimeDuration</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">relative_time</span><span class="special">);</span>
6690<span class="preprocessor">#endif</span>
6691
6692<span class="special">};</span>
6693</pre>
6694<p>
6695          <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> implements
6696          the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable" title="TimedLockable Concept"><code class="computeroutput"><span class="identifier">TimedLockable</span></code> concept</a> to provide
6697          an exclusive-ownership recursive mutex. At most one thread can own the
6698          lock on a given instance of <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> at any time.
6699          Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6700          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
6701          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6702          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
6703          and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6704          shall be permitted. A thread that already has exclusive ownership of a
6705          given <a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex" title="Class recursive_timed_mutex"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">recursive_timed_mutex</span></code></a> instance
6706          can call <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6707          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6708          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock_duration" title="m.timed_lock(rel_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>
6709          or <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>
6710          to acquire an additional level of ownership of the mutex. <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.unlock" title="m.unlock();"><code class="computeroutput"><span class="identifier">unlock</span><span class="special">()</span></code></a>
6711          must be called once for each level of ownership acquired by a single thread
6712          before ownership can be acquired by another thread.
6713        </p>
6714<div class="section">
6715<div class="titlepage"><div><div><h5 class="title">
6716<a name="thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.recursive_timed_mutex.nativehandle" title="Member function native_handle()">Member
6717          function <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code></a>
6718</h5></div></div></div>
6719<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">native_handle_type</span><span class="special">;</span>
6720<span class="identifier">native_handle_type</span> <span class="identifier">native_handle</span><span class="special">();</span>
6721</pre>
6722<div class="variablelist">
6723<p class="title"><b></b></p>
6724<dl class="variablelist">
6725<dt><span class="term">Effects:</span></dt>
6726<dd><p>
6727                  Returns an instance of <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6728                  that can be used with platform-specific APIs to manipulate the
6729                  underlying implementation. If no such instance exists, <code class="computeroutput"><span class="identifier">native_handle</span><span class="special">()</span></code>
6730                  and <code class="computeroutput"><span class="identifier">native_handle_type</span></code>
6731                  are not present.
6732                </p></dd>
6733<dt><span class="term">Throws:</span></dt>
6734<dd><p>
6735                  Nothing.
6736                </p></dd>
6737</dl>
6738</div>
6739</div>
6740</div>
6741<div class="section">
6742<div class="titlepage"><div><div><h4 class="title">
6743<a name="thread.synchronization.mutex_types.shared_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.shared_mutex" title="Class shared_mutex -- C++14">Class
6744        <code class="computeroutput"><span class="identifier">shared_mutex</span></code> -- C++14</a>
6745</h4></div></div></div>
6746<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6747
6748<span class="keyword">class</span> <span class="identifier">shared_mutex</span>
6749<span class="special">{</span>
6750<span class="keyword">public</span><span class="special">:</span>
6751    <span class="identifier">shared_mutex</span><span class="special">(</span><span class="identifier">shared_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6752    <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>
6753
6754    <span class="identifier">shared_mutex</span><span class="special">();</span>
6755    <span class="special">~</span><span class="identifier">shared_mutex</span><span class="special">();</span>
6756
6757    <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6758    <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6759    <span class="keyword">template</span> <span class="special">&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>
6760    <span class="keyword">bool</span> <span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6761    <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>
6762    <span class="keyword">bool</span> <span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6763    <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6764
6765    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6766    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6767    <span class="keyword">template</span> <span class="special">&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>
6768    <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6769    <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>
6770    <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6771    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6772
6773<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span>
6774    <span class="comment">// use upgrade_mutex instead.</span>
6775    <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6776    <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6777
6778    <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6779    <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6780    <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6781    <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
6782<span class="preprocessor">#endif</span>
6783
6784<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
6785    <span class="keyword">bool</span> <span class="identifier">timed_lock_shared</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
6786    <span class="keyword">bool</span> <span class="identifier">timed_lock</span><span class="special">(</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout</span><span class="special">);</span> <span class="comment">// DEPRECATED</span>
6787<span class="preprocessor">#endif</span>
6788
6789<span class="special">};</span>
6790</pre>
6791<p>
6792          The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_mutex</span></code> provides an implementation
6793          of a multiple-reader / single-writer mutex. It implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable" title="SharedLockable Concept -- C++14"><code class="computeroutput"><span class="identifier">SharedLockable</span></code> concept</a>.
6794        </p>
6795<p>
6796          Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6797          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
6798          <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">()</span></code>,
6799          <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">()</span></code>,
6800          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6801          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>,
6802          <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">()</span></code>,
6803          <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">()</span></code>,
6804          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>
6805          and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a>
6806          are permitted.
6807        </p>
6808<p>
6809          Note the the lack of reader-writer priority policies in shared_mutex. This
6810          is due to an algorithm credited to Alexander Terekhov which lets the OS
6811          decide which thread is the next to get the lock without caring whether
6812          a unique lock or shared lock is being sought. This results in a complete
6813          lack of reader or writer starvation. It is simply fair.
6814        </p>
6815</div>
6816<div class="section">
6817<div class="titlepage"><div><div><h4 class="title">
6818<a name="thread.synchronization.mutex_types.upgrade_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.upgrade_mutex" title="Class upgrade_mutex -- EXTENSION">Class
6819        <code class="computeroutput"><span class="identifier">upgrade_mutex</span></code> -- EXTENSION</a>
6820</h4></div></div></div>
6821<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6822
6823<span class="keyword">class</span> <span class="identifier">upgrade_mutex</span>
6824<span class="special">{</span>
6825<span class="keyword">public</span><span class="special">:</span>
6826    <span class="identifier">upgrade_mutex</span><span class="special">(</span><span class="identifier">upgrade_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6827    <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>
6828
6829    <span class="identifier">upgrade_mutex</span><span class="special">();</span>
6830    <span class="special">~</span><span class="identifier">upgrade_mutex</span><span class="special">();</span>
6831
6832    <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6833    <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6834    <span class="keyword">template</span> <span class="special">&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>
6835    <span class="keyword">bool</span> <span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6836    <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>
6837    <span class="keyword">bool</span> <span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6838    <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6839
6840    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6841    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6842    <span class="keyword">template</span> <span class="special">&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>
6843    <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6844    <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>
6845    <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6846    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6847
6848    <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span>
6849    <span class="keyword">template</span> <span class="special">&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>
6850    <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6851    <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>
6852    <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6853    <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span>
6854
6855    <span class="comment">// Shared &lt;-&gt; Exclusive</span>
6856
6857<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span>
6858    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock</span><span class="special">();</span>
6859    <span class="keyword">template</span> <span class="special">&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>
6860    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6861    <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>
6862    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6863<span class="preprocessor">#endif</span>
6864    <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span>
6865
6866    <span class="comment">// Shared &lt;-&gt; Upgrade</span>
6867
6868<span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS</span>
6869    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">();</span>
6870    <span class="keyword">template</span> <span class="special">&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>
6871    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6872    <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>
6873    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6874<span class="preprocessor">#endif</span>
6875    <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span>
6876
6877    <span class="comment">// Upgrade &lt;-&gt; Exclusive</span>
6878
6879    <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span>
6880<span class="preprocessor">#if</span>    <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PLATFORM_PTHREAD</span><span class="special">)</span>
6881    <span class="special">||</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN</span><span class="special">)</span>
6882    <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">();</span>
6883    <span class="keyword">template</span> <span class="special">&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>
6884    <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6885    <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>
6886    <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6887<span class="preprocessor">#endif</span>
6888    <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span>
6889<span class="special">};</span>
6890</pre>
6891<p>
6892          The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">upgrade_mutex</span></code> provides an implementation
6893          of a multiple-reader / single-writer mutex. It implements the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code> concept</a>.
6894        </p>
6895<p>
6896          Multiple concurrent calls to <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.basic_lockable.lock" title="m.lock();"><code class="computeroutput"><span class="identifier">lock</span><span class="special">()</span></code></a>,
6897          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.lockable.try_lock" title="m.try_lock()"><code class="computeroutput"><span class="identifier">try_lock</span><span class="special">()</span></code></a>,
6898          <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_for" title="m.try_lock_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_for</span></code></a><span class="special">()</span></code>,
6899          <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.try_lock_until" title="m.try_lock_until(abs_time)"><code class="computeroutput"><span class="identifier">try_lock_until</span></code></a><span class="special">()</span></code>,
6900          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock" title="m.timed_lock(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock</span><span class="special">()</span></code></a>,
6901          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.lock_shared" title="m.lock_shared()"><code class="computeroutput"><span class="identifier">lock_shared</span><span class="special">()</span></code></a>,
6902          <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_for" title="m.try_lock_shared_for(rel_time)"><code class="computeroutput"><span class="identifier">try_lock_shared_for</span></code></a><span class="special">()</span></code>,
6903          <code class="computeroutput"><a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared_until" title="m.try_lock_shared_until(abs_time))"><code class="computeroutput"><span class="identifier">try_lock_shared_until</span></code></a><span class="special">()</span></code>,
6904          <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.try_lock_shared" title="m.try_lock_shared()"><code class="computeroutput"><span class="identifier">try_lock_shared</span><span class="special">()</span></code></a>
6905          and <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.shared_lockable.timed_lock_shared" title="m.timed_lock_shared(abs_time)"><code class="computeroutput"><span class="identifier">timed_lock_shared</span><span class="special">()</span></code></a>
6906          are permitted.
6907        </p>
6908</div>
6909<div class="section">
6910<div class="titlepage"><div><div><h4 class="title">
6911<a name="thread.synchronization.mutex_types.null_mutex"></a><a class="link" href="synchronization.html#thread.synchronization.mutex_types.null_mutex" title="Class null_mutex -- EXTENSION">Class
6912        <code class="computeroutput"><span class="identifier">null_mutex</span></code> -- EXTENSION</a>
6913</h4></div></div></div>
6914<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
6915
6916<span class="keyword">class</span> <span class="identifier">null_mutex</span>
6917<span class="special">{</span>
6918<span class="keyword">public</span><span class="special">:</span>
6919    <span class="identifier">null_mutex</span><span class="special">(</span><span class="identifier">null_mutex</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
6920    <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>
6921
6922    <span class="identifier">null_mutex</span><span class="special">();</span>
6923    <span class="special">~</span><span class="identifier">null_mutex</span><span class="special">();</span>
6924
6925    <span class="keyword">void</span> <span class="identifier">lock_shared</span><span class="special">();</span>
6926    <span class="keyword">bool</span> <span class="identifier">try_lock_shared</span><span class="special">();</span>
6927 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6928    <span class="keyword">template</span> <span class="special">&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>
6929    <span class="keyword">bool</span> <span class="identifier">try_lock_shared_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6930    <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>
6931    <span class="keyword">bool</span> <span class="identifier">try_lock_shared_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6932 <span class="preprocessor">#endif</span>
6933    <span class="keyword">void</span> <span class="identifier">unlock_shared</span><span class="special">();</span>
6934
6935    <span class="keyword">void</span> <span class="identifier">lock</span><span class="special">();</span>
6936    <span class="keyword">bool</span> <span class="identifier">try_lock</span><span class="special">();</span>
6937 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6938    <span class="keyword">template</span> <span class="special">&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>
6939    <span class="keyword">bool</span> <span class="identifier">try_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6940    <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>
6941    <span class="keyword">bool</span> <span class="identifier">try_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6942 <span class="preprocessor">#endif</span>
6943    <span class="keyword">void</span> <span class="identifier">unlock</span><span class="special">();</span>
6944
6945    <span class="keyword">void</span> <span class="identifier">lock_upgrade</span><span class="special">();</span>
6946 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6947    <span class="keyword">template</span> <span class="special">&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>
6948    <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6949    <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>
6950    <span class="keyword">bool</span> <span class="identifier">try_lock_upgrade_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6951 <span class="preprocessor">#endif</span>
6952    <span class="keyword">void</span> <span class="identifier">unlock_upgrade</span><span class="special">();</span>
6953
6954    <span class="comment">// Shared &lt;-&gt; Exclusive</span>
6955
6956    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock</span><span class="special">();</span>
6957 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6958    <span class="keyword">template</span> <span class="special">&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>
6959    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6960    <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>
6961    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6962 <span class="preprocessor">#endif</span>
6963    <span class="keyword">void</span> <span class="identifier">unlock_and_lock_shared</span><span class="special">();</span>
6964
6965    <span class="comment">// Shared &lt;-&gt; Upgrade</span>
6966
6967    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade</span><span class="special">();</span>
6968 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6969    <span class="keyword">template</span> <span class="special">&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>
6970    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6971    <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>
6972    <span class="keyword">bool</span> <span class="identifier">try_unlock_shared_and_lock_upgrade_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6973 <span class="preprocessor">#endif</span>
6974    <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock_shared</span><span class="special">();</span>
6975
6976    <span class="comment">// Upgrade &lt;-&gt; Exclusive</span>
6977
6978    <span class="keyword">void</span> <span class="identifier">unlock_upgrade_and_lock</span><span class="special">();</span>
6979    <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock</span><span class="special">();</span>
6980 <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_USES_CHRONO</span>
6981    <span class="keyword">template</span> <span class="special">&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>
6982    <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
6983    <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>
6984    <span class="keyword">bool</span> <span class="identifier">try_unlock_upgrade_and_lock_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
6985 <span class="preprocessor">#endif</span>
6986    <span class="keyword">void</span> <span class="identifier">unlock_and_lock_upgrade</span><span class="special">();</span>
6987<span class="special">};</span>
6988</pre>
6989<p>
6990          The class <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">null_mutex</span></code> provides a no-op implementation
6991          of a multiple-reader / single-writer mutex. It is a model of the <a class="link" href="synchronization.html#thread.synchronization.mutex_concepts.upgrade_lockable" title="UpgradeLockable Concept -- EXTENSION"><code class="computeroutput"><span class="identifier">UpgradeLockable</span></code></a> concept.
6992        </p>
6993</div>
6994</div>
6995<div class="section">
6996<div class="titlepage"><div><div><h3 class="title">
6997<a name="thread.synchronization.condvar_ref"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref" title="Condition Variables">Condition Variables</a>
6998</h3></div></div></div>
6999<div class="toc"><dl class="toc">
7000<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable">Class
7001        <code class="computeroutput"><span class="identifier">condition_variable</span></code></a></span></dt>
7002<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any">Class
7003        <code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a></span></dt>
7004<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition">Typedef
7005        <code class="computeroutput"><span class="identifier">condition</span></code> DEPRECATED V3</a></span></dt>
7006<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.notify_all_at_thread_exit">Non-member
7007        Function <code class="computeroutput"><span class="identifier">notify_all_at_thread_exit</span></code>()</a></span></dt>
7008</dl></div>
7009<h5>
7010<a name="thread.synchronization.condvar_ref.h0"></a>
7011        <span class="phrase"><a name="thread.synchronization.condvar_ref.synopsis"></a></span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.synopsis">Synopsis</a>
7012      </h5>
7013<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span>
7014<span class="special">{</span>
7015  <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">cv_status</span><span class="special">;</span>
7016  <span class="special">{</span>
7017    <span class="identifier">no_timeout</span><span class="special">,</span>
7018    <span class="identifier">timeout</span>
7019  <span class="special">};</span>
7020  <span class="keyword">class</span> <span class="identifier">condition_variable</span><span class="special">;</span>
7021  <span class="keyword">class</span> <span class="identifier">condition_variable_any</span><span class="special">;</span>
7022  <span class="keyword">void</span> <span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">condition_variable</span><span class="special">&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>
7023<span class="special">}</span>
7024</pre>
7025<p>
7026        The classes <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7027        and <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>
7028        provide a mechanism for one thread to wait for notification from another
7029        thread that a particular condition has become true. The general usage pattern
7030        is that one thread locks a mutex and then calls <code class="computeroutput"><span class="identifier">wait</span></code>
7031        on an instance of <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7032        or <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>.
7033        When the thread is woken from the wait, then it checks to see if the appropriate
7034        condition is now true, and continues if so. If the condition is not true,
7035        then the thread then calls <code class="computeroutput"><span class="identifier">wait</span></code>
7036        again to resume waiting. In the simplest case, this condition is just a boolean
7037        variable:
7038      </p>
7039<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span> <span class="identifier">cond</span><span class="special">;</span>
7040<span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">mut</span><span class="special">;</span>
7041<span class="keyword">bool</span> <span class="identifier">data_ready</span><span class="special">;</span>
7042
7043<span class="keyword">void</span> <span class="identifier">process_data</span><span class="special">();</span>
7044
7045<span class="keyword">void</span> <span class="identifier">wait_for_data_to_process</span><span class="special">()</span>
7046<span class="special">{</span>
7047    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7048    <span class="keyword">while</span><span class="special">(!</span><span class="identifier">data_ready</span><span class="special">)</span>
7049    <span class="special">{</span>
7050        <span class="identifier">cond</span><span class="special">.</span><span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
7051    <span class="special">}</span>
7052    <span class="identifier">process_data</span><span class="special">();</span>
7053<span class="special">}</span>
7054</pre>
7055<p>
7056        Notice that the <code class="computeroutput"><span class="identifier">lock</span></code> is passed
7057        to <code class="computeroutput"><span class="identifier">wait</span></code>: <code class="computeroutput"><span class="identifier">wait</span></code>
7058        will atomically add the thread to the set of threads waiting on the condition
7059        variable, and unlock the mutex. When the thread is woken, the mutex will
7060        be locked again before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7061        returns. This allows other threads to acquire the mutex in order to update
7062        the shared data, and ensures that the data associated with the condition
7063        is correctly synchronized.
7064      </p>
7065<p>
7066        In the mean time, another thread sets the condition to <code class="computeroutput"><span class="keyword">true</span></code>,
7067        and then calls either <code class="computeroutput"><span class="identifier">notify_one</span></code>
7068        or <code class="computeroutput"><span class="identifier">notify_all</span></code> on the condition
7069        variable to wake one waiting thread or all the waiting threads respectively.
7070      </p>
7071<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">retrieve_data</span><span class="special">();</span>
7072<span class="keyword">void</span> <span class="identifier">prepare_data</span><span class="special">();</span>
7073
7074<span class="keyword">void</span> <span class="identifier">prepare_data_for_processing</span><span class="special">()</span>
7075<span class="special">{</span>
7076    <span class="identifier">retrieve_data</span><span class="special">();</span>
7077    <span class="identifier">prepare_data</span><span class="special">();</span>
7078    <span class="special">{</span>
7079        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lock_guard</span><span class="special">&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>
7080        <span class="identifier">data_ready</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
7081    <span class="special">}</span>
7082    <span class="identifier">cond</span><span class="special">.</span><span class="identifier">notify_one</span><span class="special">();</span>
7083<span class="special">}</span>
7084</pre>
7085<p>
7086        Note that the same mutex is locked before the shared data is updated, but
7087        that the mutex does not have to be locked across the call to <code class="computeroutput"><span class="identifier">notify_one</span></code>.
7088      </p>
7089<p>
7090        This example uses an object of type <code class="computeroutput"><span class="identifier">condition_variable</span></code>,
7091        but would work just as well with an object of type <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>:
7092        <code class="computeroutput"><span class="identifier">condition_variable_any</span></code> is
7093        more general, and will work with any kind of lock or mutex, whereas <code class="computeroutput"><span class="identifier">condition_variable</span></code> requires that the lock
7094        passed to <code class="computeroutput"><span class="identifier">wait</span></code> is an instance
7095        of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span><span class="special">&gt;</span></code>.
7096        This enables <code class="computeroutput"><span class="identifier">condition_variable</span></code>
7097        to make optimizations in some cases, based on the knowledge of the mutex
7098        type; <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>
7099        typically has a more complex implementation than <code class="computeroutput"><span class="identifier">condition_variable</span></code>.
7100      </p>
7101<div class="section">
7102<div class="titlepage"><div><div><h4 class="title">
7103<a name="thread.synchronization.condvar_ref.condition_variable"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable" title="Class condition_variable">Class
7104        <code class="computeroutput"><span class="identifier">condition_variable</span></code></a>
7105</h4></div></div></div>
7106<div class="toc"><dl class="toc">
7107<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.constructor"><code class="computeroutput"><span class="identifier">condition_variable</span><span class="special">()</span></code></a></span></dt>
7108<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable</span><span class="special">()</span></code></a></span></dt>
7109<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_one"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a></span></dt>
7110<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_all"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a></span></dt>
7111<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7112<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
7113          <span class="identifier">lock</span><span class="special">,</span>
7114          <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7115<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait"><code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7116          <span class="keyword">const</span><span class="special">&amp;</span>
7117          <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7118<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_rel"><code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
7119          <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>
7120<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
7121          <span class="identifier">lock</span><span class="special">,</span>
7122          <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7123          <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7124<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
7125          <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7126          <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7127<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
7128          <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7129          <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7130<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
7131          <span class="identifier">lock</span><span class="special">,</span>
7132          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
7133          <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7134<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
7135          <span class="identifier">lock</span><span class="special">,</span>
7136          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
7137          <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7138</dl></div>
7139<pre class="programlisting"><span class="comment">//#include &lt;boost/thread/condition_variable.hpp&gt;</span>
7140
7141<span class="keyword">namespace</span> <span class="identifier">boost</span>
7142<span class="special">{</span>
7143    <span class="keyword">class</span> <span class="identifier">condition_variable</span>
7144    <span class="special">{</span>
7145    <span class="keyword">public</span><span class="special">:</span>
7146        <span class="identifier">condition_variable</span><span class="special">();</span>
7147        <span class="special">~</span><span class="identifier">condition_variable</span><span class="special">();</span>
7148
7149        <span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
7150        <span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
7151
7152        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7153
7154        <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>
7155        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7156
7157        <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>
7158        <span class="keyword">typename</span> <span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">type</span>
7159        <span class="identifier">wait_until</span><span class="special">(</span>
7160            <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7161            <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
7162
7163        <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>
7164        <span class="keyword">bool</span>
7165        <span class="identifier">wait_until</span><span class="special">(</span>
7166            <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7167            <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
7168            <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7169
7170        <span class="keyword">template</span> <span class="special">&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>
7171        <span class="keyword">typename</span> <span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">type</span>
7172        <span class="identifier">wait_for</span><span class="special">(</span>
7173            <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7174            <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
7175
7176        <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>
7177        <span class="keyword">bool</span>
7178        <span class="identifier">wait_for</span><span class="special">(</span>
7179            <span class="identifier">unique_lock</span><span class="special">&lt;</span><span class="identifier">mutex</span><span class="special">&gt;&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7180            <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
7181            <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7182
7183    <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
7184        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7185        <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>
7186        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7187        <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>
7188        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7189        <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>
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">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>
7191        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7192
7193        <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>
7194        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7195    <span class="preprocessor">#endif</span>
7196
7197    <span class="special">};</span>
7198<span class="special">}</span>
7199</pre>
7200<div class="section">
7201<div class="titlepage"><div><div><h5 class="title">
7202<a name="thread.synchronization.condvar_ref.condition_variable.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.constructor" title="condition_variable()"><code class="computeroutput"><span class="identifier">condition_variable</span><span class="special">()</span></code></a>
7203</h5></div></div></div>
7204<div class="variablelist">
7205<p class="title"><b></b></p>
7206<dl class="variablelist">
7207<dt><span class="term">Effects:</span></dt>
7208<dd><p>
7209                  Constructs an object of class <code class="computeroutput"><span class="identifier">condition_variable</span></code>.
7210                </p></dd>
7211<dt><span class="term">Throws:</span></dt>
7212<dd><p>
7213                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7214                  occurs.
7215                </p></dd>
7216</dl>
7217</div>
7218</div>
7219<div class="section">
7220<div class="titlepage"><div><div><h5 class="title">
7221<a name="thread.synchronization.condvar_ref.condition_variable.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.destructor" title="~condition_variable()"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable</span><span class="special">()</span></code></a>
7222</h5></div></div></div>
7223<div class="variablelist">
7224<p class="title"><b></b></p>
7225<dl class="variablelist">
7226<dt><span class="term">Precondition:</span></dt>
7227<dd><p>
7228                  All threads waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> have been notified by a call
7229                  to <code class="computeroutput"><span class="identifier">notify_one</span></code> or
7230                  <code class="computeroutput"><span class="identifier">notify_all</span></code> (though
7231                  the respective calls to <code class="computeroutput"><span class="identifier">wait</span></code>
7232                  or <code class="computeroutput"><span class="identifier">timed_wait</span></code> need
7233                  not have returned).
7234                </p></dd>
7235<dt><span class="term">Effects:</span></dt>
7236<dd><p>
7237                  Destroys the object.
7238                </p></dd>
7239<dt><span class="term">Throws:</span></dt>
7240<dd><p>
7241                  Nothing.
7242                </p></dd>
7243</dl>
7244</div>
7245</div>
7246<div class="section">
7247<div class="titlepage"><div><div><h5 class="title">
7248<a name="thread.synchronization.condvar_ref.condition_variable.notify_one"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_one" title="void notify_one()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a>
7249</h5></div></div></div>
7250<div class="variablelist">
7251<p class="title"><b></b></p>
7252<dl class="variablelist">
7253<dt><span class="term">Effects:</span></dt>
7254<dd><p>
7255                  If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7256                  on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7257                  in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7258                  or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7259                  unblocks one of those threads.
7260                </p></dd>
7261<dt><span class="term">Throws:</span></dt>
7262<dd><p>
7263                  Nothing.
7264                </p></dd>
7265</dl>
7266</div>
7267</div>
7268<div class="section">
7269<div class="titlepage"><div><div><h5 class="title">
7270<a name="thread.synchronization.condvar_ref.condition_variable.notify_all"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.notify_all" title="void notify_all()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a>
7271</h5></div></div></div>
7272<div class="variablelist">
7273<p class="title"><b></b></p>
7274<dl class="variablelist">
7275<dt><span class="term">Effects:</span></dt>
7276<dd><p>
7277                  If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7278                  on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7279                  in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7280                  or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7281                  unblocks all of those threads.
7282                </p></dd>
7283<dt><span class="term">Throws:</span></dt>
7284<dd><p>
7285                  Nothing.
7286                </p></dd>
7287</dl>
7288</div>
7289</div>
7290<div class="section">
7291<div class="titlepage"><div><div><h5 class="title">
7292<a name="thread.synchronization.condvar_ref.condition_variable.wait"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait" title="void wait(boost::unique_lock&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>
7293</h5></div></div></div>
7294<div class="variablelist">
7295<p class="title"><b></b></p>
7296<dl class="variablelist">
7297<dt><span class="term">Precondition:</span></dt>
7298<dd><p>
7299                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7300                  by the current thread, and either no other thread is currently
7301                  waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7302                  or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7303                  calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7304                  <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7305                  the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7306                  as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7307                  for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7308                </p></dd>
7309<dt><span class="term">Effects:</span></dt>
7310<dd><p>
7311                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7312                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7313                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7314                  or spuriously. When the thread is unblocked (for whatever reason),
7315                  the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7316                  reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7317                  exception.
7318                </p></dd>
7319<dt><span class="term">Postcondition:</span></dt>
7320<dd><p>
7321                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7322                  by the current thread.
7323                </p></dd>
7324<dt><span class="term">Throws:</span></dt>
7325<dd><p>
7326                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7327                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7328                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7329                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7330                  with the current thread of execution.
7331                </p></dd>
7332</dl>
7333</div>
7334</div>
7335<div class="section">
7336<div class="titlepage"><div><div><h5 class="title">
7337<a name="thread.synchronization.condvar_ref.condition_variable.wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_predicate" title="template&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>
7338          <span class="identifier">lock</span><span class="special">,</span>
7339          <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
7340</h5></div></div></div>
7341<div class="variablelist">
7342<p class="title"><b></b></p>
7343<dl class="variablelist">
7344<dt><span class="term">Effects:</span></dt>
7345<dd>
7346<p>
7347                  As-if
7348</p>
7349<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7350<span class="special">{</span>
7351    <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
7352<span class="special">}</span>
7353</pre>
7354<p>
7355                </p>
7356</dd>
7357</dl>
7358</div>
7359</div>
7360<div class="section">
7361<div class="titlepage"><div><div><h5 class="title">
7362<a name="thread.synchronization.condvar_ref.condition_variable.timed_wait"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait" title="bool timed_wait(boost::unique_lock&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>
7363          <span class="keyword">const</span><span class="special">&amp;</span>
7364          <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7365</h5></div></div></div>
7366<div class="variablelist">
7367<p class="title"><b></b></p>
7368<dl class="variablelist">
7369<dt><span class="term">Precondition:</span></dt>
7370<dd><p>
7371                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7372                  by the current thread, and either no other thread is currently
7373                  waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7374                  or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7375                  calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7376                  <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7377                  the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7378                  as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7379                  for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7380                </p></dd>
7381<dt><span class="term">Effects:</span></dt>
7382<dd><p>
7383                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7384                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7385                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7386                  when the time as reported by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()</span></code> would be equal to or later than
7387                  the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7388                  or spuriously. When the thread is unblocked (for whatever reason),
7389                  the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7390                  reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7391                  exception.
7392                </p></dd>
7393<dt><span class="term">Returns:</span></dt>
7394<dd><p>
7395                  <code class="computeroutput"><span class="keyword">false</span></code> if the call
7396                  is returning because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7397                  was reached, <code class="computeroutput"><span class="keyword">true</span></code>
7398                  otherwise.
7399                </p></dd>
7400<dt><span class="term">Postcondition:</span></dt>
7401<dd><p>
7402                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7403                  by the current thread.
7404                </p></dd>
7405<dt><span class="term">Throws:</span></dt>
7406<dd><p>
7407                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7408                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7409                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7410                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7411                  with the current thread of execution.
7412                </p></dd>
7413</dl>
7414</div>
7415</div>
7416<div class="section">
7417<div class="titlepage"><div><div><h5 class="title">
7418<a name="thread.synchronization.condvar_ref.condition_variable.timed_wait_rel"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_rel" title="template&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>
7419          <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>
7420</h5></div></div></div>
7421<div class="variablelist">
7422<p class="title"><b></b></p>
7423<dl class="variablelist">
7424<dt><span class="term">Precondition:</span></dt>
7425<dd><p>
7426                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7427                  by the current thread, and either no other thread is currently
7428                  waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7429                  or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7430                  calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7431                  <code class="computeroutput"><span class="identifier">timed_wait</span></code> in all
7432                  the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7433                  as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7434                  for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7435                </p></dd>
7436<dt><span class="term">Effects:</span></dt>
7437<dd><p>
7438                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7439                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7440                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7441                  after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7442                  argument has elapsed, or spuriously. When the thread is unblocked
7443                  (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7444                  before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7445                  returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7446                  if the function exits with an exception.
7447                </p></dd>
7448<dt><span class="term">Returns:</span></dt>
7449<dd><p>
7450                  <code class="computeroutput"><span class="keyword">false</span></code> if the call
7451                  is returning because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> has elapsed, <code class="computeroutput"><span class="keyword">true</span></code> otherwise.
7452                </p></dd>
7453<dt><span class="term">Postcondition:</span></dt>
7454<dd><p>
7455                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7456                  by the current thread.
7457                </p></dd>
7458<dt><span class="term">Throws:</span></dt>
7459<dd><p>
7460                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7461                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7462                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7463                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7464                  with the current thread of execution.
7465                </p></dd>
7466</dl>
7467</div>
7468<div class="note"><table border="0" summary="Note">
7469<tr>
7470<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
7471<th align="left">Note</th>
7472</tr>
7473<tr><td align="left" valign="top"><p>
7474              The duration overload of timed_wait is difficult to use correctly.
7475              The overload taking a predicate should be preferred in most cases.
7476            </p></td></tr>
7477</table></div>
7478</div>
7479<div class="section">
7480<div class="titlepage"><div><div><h5 class="title">
7481<a name="thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_predicate" title="template&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>
7482          <span class="identifier">lock</span><span class="special">,</span>
7483          <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">,</span> <span class="identifier">predicate_type</span>
7484          <span class="identifier">pred</span><span class="special">)</span></code></a>
7485</h5></div></div></div>
7486<div class="variablelist">
7487<p class="title"><b></b></p>
7488<dl class="variablelist">
7489<dt><span class="term">Effects:</span></dt>
7490<dd>
7491<p>
7492                  As-if
7493</p>
7494<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7495<span class="special">{</span>
7496    <span class="keyword">if</span><span class="special">(!</span><span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span>
7497    <span class="special">{</span>
7498        <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
7499    <span class="special">}</span>
7500<span class="special">}</span>
7501<span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
7502</pre>
7503<p>
7504                </p>
7505</dd>
7506</dl>
7507</div>
7508</div>
7509<div class="section">
7510<div class="titlepage"><div><div><h5 class="title">
7511<a name="thread.synchronization.condvar_ref.condition_variable.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until" title="template &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>
7512          <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7513          <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7514</h5></div></div></div>
7515<div class="variablelist">
7516<p class="title"><b></b></p>
7517<dl class="variablelist">
7518<dt><span class="term">Precondition:</span></dt>
7519<dd><p>
7520                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7521                  by the current thread, and either no other thread is currently
7522                  waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7523                  or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7524                  calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7525                  <code class="computeroutput"><span class="identifier">wait_for</span></code> or <code class="computeroutput"><span class="identifier">wait_until</span></code> in all the threads
7526                  currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7527                  as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7528                  for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7529                </p></dd>
7530<dt><span class="term">Effects:</span></dt>
7531<dd><p>
7532                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7533                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7534                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7535                  when the time as reported by <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code> would be equal to or later than
7536                  the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7537                  or spuriously. When the thread is unblocked (for whatever reason),
7538                  the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7539                  reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7540                  exception.
7541                </p></dd>
7542<dt><span class="term">Returns:</span></dt>
7543<dd><p>
7544                  <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
7545                  because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7546                  was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
7547                  otherwise.
7548                </p></dd>
7549<dt><span class="term">Postcondition:</span></dt>
7550<dd><p>
7551                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7552                  by the current thread.
7553                </p></dd>
7554<dt><span class="term">Throws:</span></dt>
7555<dd><p>
7556                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7557                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7558                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7559                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7560                  with the current thread of execution.
7561                </p></dd>
7562</dl>
7563</div>
7564</div>
7565<div class="section">
7566<div class="titlepage"><div><div><h5 class="title">
7567<a name="thread.synchronization.condvar_ref.condition_variable.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for" title="template &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>
7568          <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
7569          <span class="identifier">rel_time</span><span class="special">)</span></code></a>
7570</h5></div></div></div>
7571<div class="variablelist">
7572<p class="title"><b></b></p>
7573<dl class="variablelist">
7574<dt><span class="term">Precondition:</span></dt>
7575<dd><p>
7576                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7577                  by the current thread, and either no other thread is currently
7578                  waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
7579                  or the execution of the <code class="computeroutput"><span class="identifier">mutex</span><span class="special">()</span></code> member function on the <code class="computeroutput"><span class="identifier">lock</span></code> objects supplied in the
7580                  calls to <code class="computeroutput"><span class="identifier">wait</span></code> or
7581                  <code class="computeroutput"><span class="identifier">wait_until</span></code> or
7582                  <code class="computeroutput"><span class="identifier">wait_for</span></code> in all
7583                  the threads currently waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> would return the same value
7584                  as <code class="computeroutput"><span class="identifier">lock</span><span class="special">-&gt;</span><span class="identifier">mutex</span><span class="special">()</span></code>
7585                  for this call to <code class="computeroutput"><span class="identifier">wait</span></code>.
7586                </p></dd>
7587<dt><span class="term">Effects:</span></dt>
7588<dd><p>
7589                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7590                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7591                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7592                  after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7593                  argument has elapsed, or spuriously. When the thread is unblocked
7594                  (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7595                  before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7596                  returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7597                  if the function exits with an exception.
7598                </p></dd>
7599<dt><span class="term">Returns:</span></dt>
7600<dd><p>
7601                  <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span> </code> if the call is returning
7602                  because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code>
7603                  has elapsed, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span>
7604                  </code> otherwise.
7605                </p></dd>
7606<dt><span class="term">Postcondition:</span></dt>
7607<dd><p>
7608                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7609                  by the current thread.
7610                </p></dd>
7611<dt><span class="term">Throws:</span></dt>
7612<dd><p>
7613                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7614                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7615                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7616                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7617                  with the current thread of execution.
7618                </p></dd>
7619</dl>
7620</div>
7621<div class="note"><table border="0" summary="Note">
7622<tr>
7623<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
7624<th align="left">Note</th>
7625</tr>
7626<tr><td align="left" valign="top"><p>
7627              The duration overload of timed_wait is difficult to use correctly.
7628              The overload taking a predicate should be preferred in most cases.
7629            </p></td></tr>
7630</table></div>
7631</div>
7632<div class="section">
7633<div class="titlepage"><div><div><h5 class="title">
7634<a name="thread.synchronization.condvar_ref.condition_variable.wait_until_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until_predicate" title="template &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>
7635          <span class="identifier">lock</span><span class="special">,</span>
7636          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
7637          <span class="identifier">pred</span><span class="special">)</span></code></a>
7638</h5></div></div></div>
7639<div class="variablelist">
7640<p class="title"><b></b></p>
7641<dl class="variablelist">
7642<dt><span class="term">Effects:</span></dt>
7643<dd>
7644<p>
7645                  As-if
7646</p>
7647<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7648<span class="special">{</span>
7649    <span class="keyword">if</span><span class="special">(!</span><span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span>
7650    <span class="special">{</span>
7651        <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
7652    <span class="special">}</span>
7653<span class="special">}</span>
7654<span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
7655</pre>
7656<p>
7657                </p>
7658</dd>
7659</dl>
7660</div>
7661</div>
7662<div class="section">
7663<div class="titlepage"><div><div><h5 class="title">
7664<a name="thread.synchronization.condvar_ref.condition_variable.wait_for_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for_predicate" title="template &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>
7665          <span class="identifier">lock</span><span class="special">,</span>
7666          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
7667          <span class="identifier">pred</span><span class="special">)</span></code></a>
7668</h5></div></div></div>
7669<div class="variablelist">
7670<p class="title"><b></b></p>
7671<dl class="variablelist">
7672<dt><span class="term">Effects:</span></dt>
7673<dd>
7674<p>
7675                  As-if
7676</p>
7677<pre class="programlisting"><span class="keyword">return</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">pred</span><span class="special">));</span>
7678</pre>
7679<p>
7680                </p>
7681</dd>
7682</dl>
7683</div>
7684</div>
7685</div>
7686<div class="section">
7687<div class="titlepage"><div><div><h4 class="title">
7688<a name="thread.synchronization.condvar_ref.condition_variable_any"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any" title="Class condition_variable_any">Class
7689        <code class="computeroutput"><span class="identifier">condition_variable_any</span></code></a>
7690</h4></div></div></div>
7691<div class="toc"><dl class="toc">
7692<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.constructor"><code class="computeroutput"><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a></span></dt>
7693<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.destructor"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a></span></dt>
7694<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_one"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a></span></dt>
7695<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_all"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a></span></dt>
7696<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait"><code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
7697          <span class="identifier">lock</span><span class="special">)</span></code></a></span></dt>
7698<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
7699          <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>
7700          <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7701<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait"><code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
7702          <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a></span></dt>
7703<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel"><code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
7704          <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span>
7705          <span class="keyword">const</span><span class="special">&amp;</span>
7706          <span class="identifier">rel_time</span><span class="special">)</span></code></a></span></dt>
7707<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate"><code class="computeroutput"><span class="keyword">template</span><span class="special">&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>
7708          <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7709          <span class="keyword">const</span><span class="special">&amp;</span>
7710          <span class="identifier">abs_time</span><span class="special">,</span>
7711          <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7712<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
7713          <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
7714          <span class="identifier">lock</span><span class="special">,</span>
7715          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
7716<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
7717          <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
7718          <span class="identifier">lock</span><span class="special">,</span>
7719          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
7720<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
7721          <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7722          <span class="identifier">abs_time</span><span class="special">,</span>
7723          <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7724<dt><span class="section"><a href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate"><code class="computeroutput"><span class="keyword">template</span> <span class="special">&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>
7725          <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7726          <span class="identifier">rel_time</span><span class="special">,</span>
7727          <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a></span></dt>
7728</dl></div>
7729<pre class="programlisting"><span class="comment">//#include &lt;boost/thread/condition_variable.hpp&gt;</span>
7730
7731<span class="keyword">namespace</span> <span class="identifier">boost</span>
7732<span class="special">{</span>
7733    <span class="keyword">class</span> <span class="identifier">condition_variable_any</span>
7734    <span class="special">{</span>
7735    <span class="keyword">public</span><span class="special">:</span>
7736        <span class="identifier">condition_variable_any</span><span class="special">();</span>
7737        <span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">();</span>
7738
7739        <span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">();</span>
7740        <span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">();</span>
7741
7742        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</span>
7743        <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">);</span>
7744
7745        <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>
7746        <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>
7747
7748        <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>
7749        <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span>
7750            <span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7751            <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
7752
7753        <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>
7754        <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span>
7755            <span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7756            <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
7757            <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7758
7759
7760        <span class="keyword">template</span> <span class="special">&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>
7761        <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span>
7762            <span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7763            <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
7764
7765        <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>
7766        <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span>
7767            <span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span>
7768            <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
7769            <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">);</span>
7770
7771    <span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATETIME</span>
7772        <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">lock_type</span><span class="special">&gt;</span>
7773        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7774        <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>
7775        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7776        <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>
7777        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7778        <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>
7779        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7780        <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>
7781        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7782        <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>
7783        <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
7784    <span class="preprocessor">#endif</span>
7785    <span class="special">};</span>
7786<span class="special">}</span>
7787</pre>
7788<div class="section">
7789<div class="titlepage"><div><div><h5 class="title">
7790<a name="thread.synchronization.condvar_ref.condition_variable_any.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.constructor" title="condition_variable_any()"><code class="computeroutput"><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a>
7791</h5></div></div></div>
7792<div class="variablelist">
7793<p class="title"><b></b></p>
7794<dl class="variablelist">
7795<dt><span class="term">Effects:</span></dt>
7796<dd><p>
7797                  Constructs an object of class <code class="computeroutput"><span class="identifier">condition_variable_any</span></code>.
7798                </p></dd>
7799<dt><span class="term">Throws:</span></dt>
7800<dd><p>
7801                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7802                  occurs.
7803                </p></dd>
7804</dl>
7805</div>
7806</div>
7807<div class="section">
7808<div class="titlepage"><div><div><h5 class="title">
7809<a name="thread.synchronization.condvar_ref.condition_variable_any.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.destructor" title="~condition_variable_any()"><code class="computeroutput"><span class="special">~</span><span class="identifier">condition_variable_any</span><span class="special">()</span></code></a>
7810</h5></div></div></div>
7811<div class="variablelist">
7812<p class="title"><b></b></p>
7813<dl class="variablelist">
7814<dt><span class="term">Precondition:</span></dt>
7815<dd><p>
7816                  All threads waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> have been notified by a call
7817                  to <code class="computeroutput"><span class="identifier">notify_one</span></code> or
7818                  <code class="computeroutput"><span class="identifier">notify_all</span></code> (though
7819                  the respective calls to <code class="computeroutput"><span class="identifier">wait</span></code>
7820                  or <code class="computeroutput"><span class="identifier">timed_wait</span></code> need
7821                  not have returned).
7822                </p></dd>
7823<dt><span class="term">Effects:</span></dt>
7824<dd><p>
7825                  Destroys the object.
7826                </p></dd>
7827<dt><span class="term">Throws:</span></dt>
7828<dd><p>
7829                  Nothing.
7830                </p></dd>
7831</dl>
7832</div>
7833</div>
7834<div class="section">
7835<div class="titlepage"><div><div><h5 class="title">
7836<a name="thread.synchronization.condvar_ref.condition_variable_any.notify_one"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_one" title="void notify_one()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_one</span><span class="special">()</span></code></a>
7837</h5></div></div></div>
7838<div class="variablelist">
7839<p class="title"><b></b></p>
7840<dl class="variablelist">
7841<dt><span class="term">Effects:</span></dt>
7842<dd><p>
7843                  If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7844                  on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7845                  in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7846                  or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7847                  unblocks one of those threads.
7848                </p></dd>
7849<dt><span class="term">Throws:</span></dt>
7850<dd><p>
7851                  Nothing.
7852                </p></dd>
7853</dl>
7854</div>
7855</div>
7856<div class="section">
7857<div class="titlepage"><div><div><h5 class="title">
7858<a name="thread.synchronization.condvar_ref.condition_variable_any.notify_all"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.notify_all" title="void notify_all()"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">notify_all</span><span class="special">()</span></code></a>
7859</h5></div></div></div>
7860<div class="variablelist">
7861<p class="title"><b></b></p>
7862<dl class="variablelist">
7863<dt><span class="term">Effects:</span></dt>
7864<dd><p>
7865                  If any threads are currently <span class="emphasis"><em>blocked</em></span> waiting
7866                  on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
7867                  in a call to <code class="computeroutput"><span class="identifier">wait</span></code>
7868                  or <code class="computeroutput"><span class="identifier">timed_wait</span></code>,
7869                  unblocks all of those threads.
7870                </p></dd>
7871<dt><span class="term">Throws:</span></dt>
7872<dd><p>
7873                  Nothing.
7874                </p></dd>
7875</dl>
7876</div>
7877</div>
7878<div class="section">
7879<div class="titlepage"><div><div><h5 class="title">
7880<a name="thread.synchronization.condvar_ref.condition_variable_any.wait"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait" title="template&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>
7881          <span class="identifier">lock</span><span class="special">)</span></code></a>
7882</h5></div></div></div>
7883<div class="variablelist">
7884<p class="title"><b></b></p>
7885<dl class="variablelist">
7886<dt><span class="term">Effects:</span></dt>
7887<dd><p>
7888                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7889                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7890                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7891                  or spuriously. When the thread is unblocked (for whatever reason),
7892                  the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7893                  reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7894                  exception.
7895                </p></dd>
7896<dt><span class="term">Postcondition:</span></dt>
7897<dd><p>
7898                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7899                  by the current thread.
7900                </p></dd>
7901<dt><span class="term">Throws:</span></dt>
7902<dd><p>
7903                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7904                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7905                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7906                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7907                  with the current thread of execution.
7908                </p></dd>
7909</dl>
7910</div>
7911</div>
7912<div class="section">
7913<div class="titlepage"><div><div><h5 class="title">
7914<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_predicate" title="template&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>
7915          <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>
7916          <span class="identifier">pred</span><span class="special">)</span></code></a>
7917</h5></div></div></div>
7918<div class="variablelist">
7919<p class="title"><b></b></p>
7920<dl class="variablelist">
7921<dt><span class="term">Effects:</span></dt>
7922<dd>
7923<p>
7924                  As-if
7925</p>
7926<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
7927<span class="special">{</span>
7928    <span class="identifier">wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">);</span>
7929<span class="special">}</span>
7930</pre>
7931<p>
7932                </p>
7933</dd>
7934</dl>
7935</div>
7936</div>
7937<div class="section">
7938<div class="titlepage"><div><div><h5 class="title">
7939<a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait" title="template&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>
7940          <span class="identifier">lock</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span></code></a>
7941</h5></div></div></div>
7942<div class="variablelist">
7943<p class="title"><b></b></p>
7944<dl class="variablelist">
7945<dt><span class="term">Effects:</span></dt>
7946<dd><p>
7947                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7948                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7949                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7950                  when the time as reported by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_system_time</span><span class="special">()</span></code> would be equal to or later than
7951                  the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
7952                  or spuriously. When the thread is unblocked (for whatever reason),
7953                  the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
7954                  reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
7955                  exception.
7956                </p></dd>
7957<dt><span class="term">Returns:</span></dt>
7958<dd><p>
7959                  <code class="computeroutput"><span class="keyword">false</span></code> if the call
7960                  is returning because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
7961                  was reached, <code class="computeroutput"><span class="keyword">true</span></code>
7962                  otherwise.
7963                </p></dd>
7964<dt><span class="term">Postcondition:</span></dt>
7965<dd><p>
7966                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
7967                  by the current thread.
7968                </p></dd>
7969<dt><span class="term">Throws:</span></dt>
7970<dd><p>
7971                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
7972                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
7973                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
7974                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
7975                  with the current thread of execution.
7976                </p></dd>
7977</dl>
7978</div>
7979</div>
7980<div class="section">
7981<div class="titlepage"><div><div><h5 class="title">
7982<a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_rel" title="template&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>
7983          <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span> <span class="identifier">lock</span><span class="special">,</span><span class="identifier">duration_type</span>
7984          <span class="keyword">const</span><span class="special">&amp;</span>
7985          <span class="identifier">rel_time</span><span class="special">)</span></code></a>
7986</h5></div></div></div>
7987<div class="variablelist">
7988<p class="title"><b></b></p>
7989<dl class="variablelist">
7990<dt><span class="term">Effects:</span></dt>
7991<dd><p>
7992                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
7993                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
7994                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
7995                  after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
7996                  argument has elapsed, or spuriously. When the thread is unblocked
7997                  (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
7998                  before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
7999                  returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
8000                  if the function exits with an exception.
8001                </p></dd>
8002<dt><span class="term">Returns:</span></dt>
8003<dd><p>
8004                  <code class="computeroutput"><span class="keyword">false</span></code> if the call
8005                  is returning because the time period specified by <code class="computeroutput"><span class="identifier">rel_time</span></code> has elapsed, <code class="computeroutput"><span class="keyword">true</span></code> otherwise.
8006                </p></dd>
8007<dt><span class="term">Postcondition:</span></dt>
8008<dd><p>
8009                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8010                  by the current thread.
8011                </p></dd>
8012<dt><span class="term">Throws:</span></dt>
8013<dd><p>
8014                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8015                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8016                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8017                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8018                  with the current thread of execution.
8019                </p></dd>
8020</dl>
8021</div>
8022<div class="note"><table border="0" summary="Note">
8023<tr>
8024<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
8025<th align="left">Note</th>
8026</tr>
8027<tr><td align="left" valign="top"><p>
8028              The duration overload of timed_wait is difficult to use correctly.
8029              The overload taking a predicate should be preferred in most cases.
8030            </p></td></tr>
8031</table></div>
8032</div>
8033<div class="section">
8034<div class="titlepage"><div><div><h5 class="title">
8035<a name="thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.timed_wait_predicate" title="template&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>
8036          <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
8037          <span class="keyword">const</span><span class="special">&amp;</span>
8038          <span class="identifier">abs_time</span><span class="special">,</span>
8039          <span class="identifier">predicate_type</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8040</h5></div></div></div>
8041<div class="variablelist">
8042<p class="title"><b></b></p>
8043<dl class="variablelist">
8044<dt><span class="term">Effects:</span></dt>
8045<dd>
8046<p>
8047                  As-if
8048</p>
8049<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
8050<span class="special">{</span>
8051    <span class="keyword">if</span><span class="special">(!</span><span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span><span class="identifier">abs_time</span><span class="special">))</span>
8052    <span class="special">{</span>
8053        <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
8054    <span class="special">}</span>
8055<span class="special">}</span>
8056<span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
8057</pre>
8058<p>
8059                </p>
8060</dd>
8061</dl>
8062</div>
8063</div>
8064<div class="section">
8065<div class="titlepage"><div><div><h5 class="title">
8066<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until" title="template &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>
8067          <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
8068          <span class="identifier">lock</span><span class="special">,</span>
8069          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
8070</h5></div></div></div>
8071<div class="variablelist">
8072<p class="title"><b></b></p>
8073<dl class="variablelist">
8074<dt><span class="term">Effects:</span></dt>
8075<dd><p>
8076                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
8077                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
8078                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
8079                  when the time as reported by <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span></code> would be equal to or later than
8080                  the specified <code class="computeroutput"><span class="identifier">abs_time</span></code>,
8081                  or spuriously. When the thread is unblocked (for whatever reason),
8082                  the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> before the call to <code class="computeroutput"><span class="identifier">wait</span></code> returns. The lock is also
8083                  reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code> if the function exits with an
8084                  exception.
8085                </p></dd>
8086<dt><span class="term">Returns:</span></dt>
8087<dd><p>
8088                  <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
8089                  because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
8090                  was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
8091                  otherwise.
8092                </p></dd>
8093<dt><span class="term">Postcondition:</span></dt>
8094<dd><p>
8095                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8096                  by the current thread.
8097                </p></dd>
8098<dt><span class="term">Throws:</span></dt>
8099<dd><p>
8100                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8101                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8102                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8103                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8104                  with the current thread of execution.
8105                </p></dd>
8106</dl>
8107</div>
8108</div>
8109<div class="section">
8110<div class="titlepage"><div><div><h5 class="title">
8111<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for" title="template &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>
8112          <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&amp;</span>
8113          <span class="identifier">lock</span><span class="special">,</span>
8114          <span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
8115</h5></div></div></div>
8116<div class="variablelist">
8117<p class="title"><b></b></p>
8118<dl class="variablelist">
8119<dt><span class="term">Effects:</span></dt>
8120<dd><p>
8121                  Atomically call <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">()</span></code> and blocks the current thread.
8122                  The thread will unblock when notified by a call to <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_one</span><span class="special">()</span></code>
8123                  or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">notify_all</span><span class="special">()</span></code>,
8124                  after the period of time indicated by the <code class="computeroutput"><span class="identifier">rel_time</span></code>
8125                  argument has elapsed, or spuriously. When the thread is unblocked
8126                  (for whatever reason), the lock is reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
8127                  before the call to <code class="computeroutput"><span class="identifier">wait</span></code>
8128                  returns. The lock is also reacquired by invoking <code class="computeroutput"><span class="identifier">lock</span><span class="special">.</span><span class="identifier">lock</span><span class="special">()</span></code>
8129                  if the function exits with an exception.
8130                </p></dd>
8131<dt><span class="term">Returns:</span></dt>
8132<dd><p>
8133                  <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">timeout</span></code> if the call is returning
8134                  because the time specified by <code class="computeroutput"><span class="identifier">abs_time</span></code>
8135                  was reached, <code class="computeroutput"><span class="identifier">cv_status</span><span class="special">::</span><span class="identifier">no_timeout</span></code>
8136                  otherwise.
8137                </p></dd>
8138<dt><span class="term">Postcondition:</span></dt>
8139<dd><p>
8140                  <code class="computeroutput"><span class="identifier">lock</span></code> is locked
8141                  by the current thread.
8142                </p></dd>
8143<dt><span class="term">Throws:</span></dt>
8144<dd><p>
8145                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8146                  occurs. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8147                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8148                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8149                  with the current thread of execution.
8150                </p></dd>
8151</dl>
8152</div>
8153<div class="note"><table border="0" summary="Note">
8154<tr>
8155<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
8156<th align="left">Note</th>
8157</tr>
8158<tr><td align="left" valign="top"><p>
8159              The duration overload of timed_wait is difficult to use correctly.
8160              The overload taking a predicate should be preferred in most cases.
8161            </p></td></tr>
8162</table></div>
8163</div>
8164<div class="section">
8165<div class="titlepage"><div><div><h5 class="title">
8166<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until_predicate" title="template &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>
8167          <span class="keyword">bool</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
8168          <span class="identifier">abs_time</span><span class="special">,</span>
8169          <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8170</h5></div></div></div>
8171<div class="variablelist">
8172<p class="title"><b></b></p>
8173<dl class="variablelist">
8174<dt><span class="term">Effects:</span></dt>
8175<dd>
8176<p>
8177                  As-if
8178</p>
8179<pre class="programlisting"><span class="keyword">while</span><span class="special">(!</span><span class="identifier">pred</span><span class="special">())</span>
8180<span class="special">{</span>
8181    <span class="keyword">if</span><span class="special">(!</span><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_until" title="template &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>
8182    <span class="special">{</span>
8183        <span class="keyword">return</span> <span class="identifier">pred</span><span class="special">();</span>
8184    <span class="special">}</span>
8185<span class="special">}</span>
8186<span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
8187</pre>
8188<p>
8189                </p>
8190</dd>
8191</dl>
8192</div>
8193</div>
8194<div class="section">
8195<div class="titlepage"><div><div><h5 class="title">
8196<a name="thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable_any.wait_for_predicate" title="template &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>
8197          <span class="keyword">bool</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="identifier">lock_type</span><span class="special">&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>
8198          <span class="identifier">rel_time</span><span class="special">,</span>
8199          <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span></code></a>
8200</h5></div></div></div>
8201<div class="variablelist">
8202<p class="title"><b></b></p>
8203<dl class="variablelist">
8204<dt><span class="term">Effects:</span></dt>
8205<dd>
8206<p>
8207                  As-if
8208</p>
8209<pre class="programlisting"><span class="keyword">return</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="identifier">lock</span><span class="special">,</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">now</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">pred</span><span class="special">));</span>
8210</pre>
8211<p>
8212                </p>
8213</dd>
8214</dl>
8215</div>
8216</div>
8217</div>
8218<div class="section">
8219<div class="titlepage"><div><div><h4 class="title">
8220<a name="thread.synchronization.condvar_ref.condition"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition" title="Typedef condition DEPRECATED V3">Typedef
8221        <code class="computeroutput"><span class="identifier">condition</span></code> DEPRECATED V3</a>
8222</h4></div></div></div>
8223<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/condition.hpp&gt;</span>
8224<span class="keyword">namespace</span> <span class="identifier">boost</span>
8225<span class="special">{</span>
8226
8227  <span class="keyword">typedef</span> <span class="identifier">condition_variable_any</span> <span class="identifier">condition</span><span class="special">;</span>
8228
8229<span class="special">}</span>
8230</pre>
8231<p>
8232          The typedef <code class="computeroutput"><span class="identifier">condition</span></code> is
8233          provided for backwards compatibility with previous boost releases.
8234        </p>
8235</div>
8236<div class="section">
8237<div class="titlepage"><div><div><h4 class="title">
8238<a name="thread.synchronization.condvar_ref.notify_all_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.condvar_ref.notify_all_at_thread_exit" title="Non-member Function notify_all_at_thread_exit()">Non-member
8239        Function <code class="computeroutput"><span class="identifier">notify_all_at_thread_exit</span></code>()</a>
8240</h4></div></div></div>
8241<pre class="programlisting"><span class="comment">// #include &lt;boost/thread/condition_variable.hpp&gt;</span>
8242
8243<span class="keyword">namespace</span> <span class="identifier">boost</span>
8244<span class="special">{</span>
8245  <span class="keyword">void</span> <span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">condition_variable</span><span class="special">&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>
8246<span class="special">}</span>
8247</pre>
8248<div class="variablelist">
8249<p class="title"><b></b></p>
8250<dl class="variablelist">
8251<dt><span class="term">Requires:</span></dt>
8252<dd><p>
8253                <code class="computeroutput"><span class="identifier">lk</span></code> is locked by the
8254                calling thread and either no other thread is waiting on <code class="computeroutput"><span class="identifier">cond</span></code>, or <code class="computeroutput"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">mutex</span><span class="special">()</span></code> returns the same value for each
8255                of the lock arguments supplied by all concurrently waiting (via
8256                <code class="computeroutput"><span class="identifier">wait</span></code>, <code class="computeroutput"><span class="identifier">wait_for</span></code>, or <code class="computeroutput"><span class="identifier">wait_until</span></code>)
8257                threads.
8258              </p></dd>
8259<dt><span class="term">Effects:</span></dt>
8260<dd>
8261<p>
8262                transfers ownership of the lock associated with <code class="computeroutput"><span class="identifier">lk</span></code>
8263                into internal storage and schedules <code class="computeroutput"><span class="identifier">cond</span></code>
8264                to be notified when the current thread exits, after all objects of
8265                thread storage duration associated with the current thread have been
8266                destroyed. This notification shall be as if
8267              </p>
8268<p>
8269</p>
8270<pre class="programlisting"><span class="identifier">lk</span><span class="special">.</span><span class="identifier">unlock</span><span class="special">();</span>
8271<span class="identifier">cond</span><span class="special">.</span><span class="identifier">notify_all</span><span class="special">();</span>
8272</pre>
8273<p>
8274              </p>
8275</dd>
8276</dl>
8277</div>
8278</div>
8279</div>
8280<div class="section">
8281<div class="titlepage"><div><div><h3 class="title">
8282<a name="thread.synchronization.once"></a><a class="link" href="synchronization.html#thread.synchronization.once" title="One-time Initialization">One-time Initialization</a>
8283</h3></div></div></div>
8284<div class="toc"><dl class="toc">
8285<dt><span class="section"><a href="synchronization.html#thread.synchronization.once.once_flag">Typedef <code class="computeroutput"><span class="identifier">once_flag</span></code></a></span></dt>
8286<dt><span class="section"><a href="synchronization.html#thread.synchronization.once.call_once">Non-member function
8287        <code class="computeroutput"><span class="identifier">call_once</span></code></a></span></dt>
8288</dl></div>
8289<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
8290
8291<span class="keyword">namespace</span> <span class="identifier">boost</span>
8292<span class="special">{</span>
8293  <span class="keyword">struct</span> <span class="identifier">once_flag</span><span class="special">;</span>
8294  <span class="keyword">template</span><span class="special">&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>
8295  <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="identifier">once_flag</span><span class="special">&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>
8296
8297<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0</span>
8298  <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">func</span><span class="special">)(),</span><span class="identifier">once_flag</span><span class="special">&amp;</span> <span class="identifier">flag</span><span class="special">);</span>
8299<span class="preprocessor">#endif</span>
8300
8301<span class="special">}</span>
8302</pre>
8303<div class="warning"><table border="0" summary="Warning">
8304<tr>
8305<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
8306<th align="left">Warning</th>
8307</tr>
8308<tr><td align="left" valign="top"><p>
8309          the variadic prototype is provided only on C++11 compilers supporting variadic
8310          templates, otherwise the interface is limited up to 3 parameters.
8311        </p></td></tr>
8312</table></div>
8313<div class="warning"><table border="0" summary="Warning">
8314<tr>
8315<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
8316<th align="left">Warning</th>
8317</tr>
8318<tr><td align="left" valign="top"><p>
8319          the move semantics is ensured only on C++11 compilers supporting SFINAE
8320          expression, decltype N3276 and auto. Waiting for a boost::bind that is
8321          move aware.
8322        </p></td></tr>
8323</table></div>
8324<p>
8325        <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">call_once</span></code> provides a mechanism for ensuring
8326        that an initialization routine is run exactly once without data races or
8327        deadlocks.
8328      </p>
8329<div class="section">
8330<div class="titlepage"><div><div><h4 class="title">
8331<a name="thread.synchronization.once.once_flag"></a><a class="link" href="synchronization.html#thread.synchronization.once.once_flag" title="Typedef once_flag">Typedef <code class="computeroutput"><span class="identifier">once_flag</span></code></a>
8332</h4></div></div></div>
8333<pre class="programlisting"><span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_THREAD_PROVIDES_ONCE_CXX11</span>
8334<span class="keyword">struct</span> <span class="identifier">once_flag</span>
8335<span class="special">{</span>
8336  <span class="keyword">constexpr</span> <span class="identifier">once_flag</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
8337  <span class="identifier">once_flag</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">once_flag</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8338  <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>
8339<span class="special">};</span>
8340<span class="preprocessor">#else</span>
8341<span class="keyword">typedef</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">type</span> <span class="identifier">once_flag</span><span class="special">;</span>
8342<span class="preprocessor">#define</span> <span class="identifier">BOOST_ONCE_INIT</span> <span class="identifier">platform</span><span class="special">-</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">initializer</span>
8343<span class="preprocessor">#endif</span>
8344</pre>
8345<p>
8346          Objects of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">once_flag</span></code> shall be initialized with
8347          <code class="computeroutput"><span class="identifier">BOOST_ONCE_INIT</span></code> if BOOST_THREAD_PROVIDES_ONCE_CXX11
8348          is not defined
8349        </p>
8350<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">once_flag</span> <span class="identifier">f</span><span class="special">=</span><span class="identifier">BOOST_ONCE_INIT</span><span class="special">;</span>
8351</pre>
8352</div>
8353<div class="section">
8354<div class="titlepage"><div><div><h4 class="title">
8355<a name="thread.synchronization.once.call_once"></a><a class="link" href="synchronization.html#thread.synchronization.once.call_once" title="Non-member function call_once">Non-member function
8356        <code class="computeroutput"><span class="identifier">call_once</span></code></a>
8357</h4></div></div></div>
8358<pre class="programlisting"><span class="keyword">template</span><span class="special">&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>
8359<span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="identifier">once_flag</span><span class="special">&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>
8360</pre>
8361<div class="variablelist">
8362<p class="title"><b></b></p>
8363<dl class="variablelist">
8364<dt><span class="term">Requires:</span></dt>
8365<dd><p>
8366                <code class="computeroutput"><span class="identifier">Function</span></code> and each
8367                or the <code class="computeroutput"><span class="identifier">ArgTypes</span></code> are
8368                <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
8369                and <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Function</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)),</span>
8370                <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">ArgTypes</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...)</span></code>
8371                shall be well formed.
8372              </p></dd>
8373<dt><span class="term">Effects:</span></dt>
8374<dd><p>
8375                Calls to <code class="computeroutput"><span class="identifier">call_once</span></code>
8376                on the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8377                object are serialized. If there has been no prior effective <code class="computeroutput"><span class="identifier">call_once</span></code> on the same <code class="computeroutput"><span class="identifier">once_flag</span></code> object, the argument
8378                <code class="computeroutput"><span class="identifier">func</span></code> is called as-if
8379                by invoking <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&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
8380                if <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Function</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)),</span>
8381                <span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">ArgTypes</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...)</span></code>
8382                returns without exception. If an exception is thrown, the exception
8383                is propagated to the caller. If there has been a prior effective
8384                <code class="computeroutput"><span class="identifier">call_once</span></code> on the
8385                same <code class="computeroutput"><span class="identifier">once_flag</span></code> object,
8386                the <code class="computeroutput"><span class="identifier">call_once</span></code> returns
8387                without invoking <code class="computeroutput"><span class="identifier">func</span></code>.
8388              </p></dd>
8389<dt><span class="term">Synchronization:</span></dt>
8390<dd><p>
8391                The completion of an effective <code class="computeroutput"><span class="identifier">call_once</span></code>
8392                invocation on a <code class="computeroutput"><span class="identifier">once_flag</span></code>
8393                object, synchronizes with all subsequent <code class="computeroutput"><span class="identifier">call_once</span></code>
8394                invocations on the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8395                object.
8396              </p></dd>
8397<dt><span class="term">Throws:</span></dt>
8398<dd><p>
8399                <code class="computeroutput"><span class="identifier">thread_resource_error</span></code>
8400                when the effects cannot be achieved or any exception propagated from
8401                <code class="computeroutput"><span class="identifier">func</span></code>.
8402              </p></dd>
8403<dt><span class="term">Note:</span></dt>
8404<dd><p>
8405                The function passed to <code class="computeroutput"><span class="identifier">call_once</span></code>
8406                must not also call <code class="computeroutput"><span class="identifier">call_once</span></code>
8407                passing the same <code class="computeroutput"><span class="identifier">once_flag</span></code>
8408                object. This may cause deadlock, or invoking the passed function
8409                a second time. The alternative is to allow the second call to return
8410                immediately, but that assumes the code knows it has been called recursively,
8411                and can proceed even though the call to <code class="computeroutput"><span class="identifier">call_once</span></code>
8412                didn't actually call the function, in which case it could also avoid
8413                calling <code class="computeroutput"><span class="identifier">call_once</span></code>
8414                recursively.
8415              </p></dd>
8416<dt><span class="term">Note:</span></dt>
8417<dd><p>
8418                On some compilers this function has some restrictions, e.g. if variadic
8419                templates are not supported the number of arguments is limited to
8420                3; .
8421              </p></dd>
8422</dl>
8423</div>
8424<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">call_once</span><span class="special">(</span><span class="keyword">void</span> <span class="special">(*</span><span class="identifier">func</span><span class="special">)(),</span><span class="identifier">once_flag</span><span class="special">&amp;</span> <span class="identifier">flag</span><span class="special">);</span>
8425</pre>
8426<p>
8427          This second overload is provided for backwards compatibility and is deprecated.
8428          The effects of <code class="computeroutput"><span class="identifier">call_once</span><span class="special">(</span><span class="identifier">func</span><span class="special">,</span><span class="identifier">flag</span><span class="special">)</span></code> shall be the same as those of <code class="computeroutput"><span class="identifier">call_once</span><span class="special">(</span><span class="identifier">flag</span><span class="special">,</span><span class="identifier">func</span><span class="special">)</span></code>.
8429        </p>
8430</div>
8431</div>
8432<div class="section">
8433<div class="titlepage"><div><div><h3 class="title">
8434<a name="thread.synchronization.barriers"></a><a class="link" href="synchronization.html#thread.synchronization.barriers" title="Barriers -- EXTENSION">Barriers -- EXTENSION</a>
8435</h3></div></div></div>
8436<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier">Class <code class="computeroutput"><span class="identifier">barrier</span></code></a></span></dt></dl></div>
8437<p>
8438        A barrier is a simple concept. Also known as a <span class="emphasis"><em>rendezvous</em></span>,
8439        it is a synchronization point between multiple threads. The barrier is configured
8440        for a particular number of threads (<code class="computeroutput"><span class="identifier">n</span></code>),
8441        and as threads reach the barrier they must wait until all <code class="computeroutput"><span class="identifier">n</span></code>
8442        threads have arrived. Once the <code class="computeroutput"><span class="identifier">n</span></code>-th
8443        thread has reached the barrier, all the waiting threads can proceed, and
8444        the barrier is reset.
8445      </p>
8446<div class="section">
8447<div class="titlepage"><div><div><h4 class="title">
8448<a name="thread.synchronization.barriers.barrier"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier" title="Class barrier">Class <code class="computeroutput"><span class="identifier">barrier</span></code></a>
8449</h4></div></div></div>
8450<div class="toc"><dl class="toc">
8451<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__">Constructor
8452          <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)</span></code></a></span></dt>
8453<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____">Constructor
8454          <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;)</span></code></a></span></dt>
8455<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.destructor___barrier___">Destructor
8456          <code class="computeroutput"><span class="special">~</span><span class="identifier">barrier</span><span class="special">()</span></code></a></span></dt>
8457<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.member_function__wait___">Member
8458          Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a></span></dt>
8459<dt><span class="section"><a href="synchronization.html#thread.synchronization.barriers.barrier.member_function__count_down_and_wait___">Member
8460          Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a></span></dt>
8461</dl></div>
8462<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
8463
8464<span class="keyword">class</span> <span class="identifier">barrier</span>
8465<span class="special">{</span>
8466<span class="keyword">public</span><span class="special">:</span>
8467    <span class="identifier">barrier</span><span class="special">(</span><span class="identifier">barrier</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8468    <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>
8469
8470    <span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">);</span>
8471    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
8472    <span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;);</span>
8473
8474    <span class="special">~</span><span class="identifier">barrier</span><span class="special">();</span>
8475
8476    <span class="keyword">bool</span> <span class="identifier">wait</span><span class="special">();</span>
8477    <span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8478<span class="special">};</span>
8479</pre>
8480<p>
8481          Instances of <a class="link" href="synchronization.html#thread.synchronization.barriers.barrier" title="Class barrier"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">barrier</span></code></a> are not copyable or movable.
8482        </p>
8483<div class="section">
8484<div class="titlepage"><div><div><h5 class="title">
8485<a name="thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__" title="Constructor barrier(unsigned int)">Constructor
8486          <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)</span></code></a>
8487</h5></div></div></div>
8488<pre class="programlisting"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">);</span>
8489</pre>
8490<div class="variablelist">
8491<p class="title"><b></b></p>
8492<dl class="variablelist">
8493<dt><span class="term">Effects:</span></dt>
8494<dd><p>
8495                  Construct a barrier for <code class="computeroutput"><span class="identifier">count</span></code>
8496                  threads.
8497                </p></dd>
8498<dt><span class="term">Throws:</span></dt>
8499<dd><p>
8500                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8501                  occurs.
8502                </p></dd>
8503</dl>
8504</div>
8505</div>
8506<div class="section">
8507<div class="titlepage"><div><div><h5 class="title">
8508<a name="thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.constructor__barrier_unsigned_int__f____" title="Constructor barrier(unsigned int, F&amp;&amp;)">Constructor
8509          <code class="computeroutput"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;)</span></code></a>
8510</h5></div></div></div>
8511<pre class="programlisting"><span class="identifier">barrier</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">completion</span><span class="special">);</span>
8512</pre>
8513<div class="variablelist">
8514<p class="title"><b></b></p>
8515<dl class="variablelist">
8516<dt><span class="term">Requires:</span></dt>
8517<dd><p>
8518                  The result type of the completion function call <code class="computeroutput"><span class="identifier">completion</span><span class="special">()</span></code> is <code class="computeroutput"><span class="keyword">void</span></code>
8519                  or <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">int</span></code>.
8520                </p></dd>
8521<dt><span class="term">Effects:</span></dt>
8522<dd><p>
8523                  Construct a barrier for <code class="computeroutput"><span class="identifier">count</span></code>
8524                  threads and a completion function <code class="computeroutput"><span class="identifier">completion</span></code>.
8525                </p></dd>
8526<dt><span class="term">Throws:</span></dt>
8527<dd><p>
8528                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8529                  occurs.
8530                </p></dd>
8531</dl>
8532</div>
8533</div>
8534<div class="section">
8535<div class="titlepage"><div><div><h5 class="title">
8536<a name="thread.synchronization.barriers.barrier.destructor___barrier___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.destructor___barrier___" title="Destructor ~barrier()">Destructor
8537          <code class="computeroutput"><span class="special">~</span><span class="identifier">barrier</span><span class="special">()</span></code></a>
8538</h5></div></div></div>
8539<pre class="programlisting"><span class="special">~</span><span class="identifier">barrier</span><span class="special">();</span>
8540</pre>
8541<div class="variablelist">
8542<p class="title"><b></b></p>
8543<dl class="variablelist">
8544<dt><span class="term">Precondition:</span></dt>
8545<dd><p>
8546                  No threads are waiting on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8547                </p></dd>
8548<dt><span class="term">Effects:</span></dt>
8549<dd><p>
8550                  Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8551                </p></dd>
8552<dt><span class="term">Throws:</span></dt>
8553<dd><p>
8554                  Nothing.
8555                </p></dd>
8556</dl>
8557</div>
8558</div>
8559<div class="section">
8560<div class="titlepage"><div><div><h5 class="title">
8561<a name="thread.synchronization.barriers.barrier.member_function__wait___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.member_function__wait___" title="Member Function wait()">Member
8562          Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
8563</h5></div></div></div>
8564<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">wait</span><span class="special">();</span>
8565</pre>
8566<div class="variablelist">
8567<p class="title"><b></b></p>
8568<dl class="variablelist">
8569<dt><span class="term">Effects:</span></dt>
8570<dd><p>
8571                  Block until <code class="computeroutput"><span class="identifier">count</span></code>
8572                  threads have called <code class="computeroutput"><span class="identifier">wait</span></code>
8573                  or <code class="computeroutput"><span class="identifier">count_down_and_wait</span></code>
8574                  on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8575                  When the <code class="computeroutput"><span class="identifier">count</span></code>-th
8576                  thread calls <code class="computeroutput"><span class="identifier">wait</span></code>,
8577                  the barrier is reset and all waiting threads are unblocked. The
8578                  reset depends on whether the barrier was constructed with a completion
8579                  function or not. If there is no completion function or if the completion
8580                  function result is void, the reset consists in restoring the original
8581                  count. Otherwise the rest consist in assigning the result of the
8582                  completion function (which must not be 0).
8583                </p></dd>
8584<dt><span class="term">Returns:</span></dt>
8585<dd><p>
8586                  <code class="computeroutput"><span class="keyword">true</span></code> for exactly one
8587                  thread from each batch of waiting threads, <code class="computeroutput"><span class="keyword">false</span></code>
8588                  otherwise.
8589                </p></dd>
8590<dt><span class="term">Throws:</span></dt>
8591<dd>
8592<p>
8593                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8594                  occurs.
8595                </p>
8596<p>
8597                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8598                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8599                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8600                  with the current thread of execution.
8601                </p>
8602</dd>
8603<dt><span class="term">Notes:</span></dt>
8604<dd><p>
8605                  <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
8606                  is an <span class="emphasis"><em>interruption point</em></span>.
8607                </p></dd>
8608</dl>
8609</div>
8610</div>
8611<div class="section">
8612<div class="titlepage"><div><div><h5 class="title">
8613<a name="thread.synchronization.barriers.barrier.member_function__count_down_and_wait___"></a><a class="link" href="synchronization.html#thread.synchronization.barriers.barrier.member_function__count_down_and_wait___" title="Member Function count_down_and_wait()">Member
8614          Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a>
8615</h5></div></div></div>
8616<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8617</pre>
8618<div class="variablelist">
8619<p class="title"><b></b></p>
8620<dl class="variablelist">
8621<dt><span class="term">Effects:</span></dt>
8622<dd><p>
8623                  Block until <code class="computeroutput"><span class="identifier">count</span></code>
8624                  threads have called <code class="computeroutput"><span class="identifier">wait</span></code>
8625                  or <code class="computeroutput"><span class="identifier">count_down_and_wait</span></code>
8626                  on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8627                  When the <code class="computeroutput"><span class="identifier">count</span></code>-th
8628                  thread calls <code class="computeroutput"><span class="identifier">wait</span></code>,
8629                  the barrier is reset and all waiting threads are unblocked. The
8630                  reset depends on whether the barrier was constructed with a completion
8631                  function or not. If there is no completion function or if the completion
8632                  function result is void, the reset consists in restoring the original
8633                  count. Otherwise the rest consist in assigning the result of the
8634                  completion function (which must not be 0).
8635                </p></dd>
8636<dt><span class="term">Throws:</span></dt>
8637<dd>
8638<p>
8639                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8640                  occurs.
8641                </p>
8642<p>
8643                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8644                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8645                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8646                  with the current thread of execution.
8647                </p>
8648</dd>
8649<dt><span class="term">Notes:</span></dt>
8650<dd><p>
8651                  <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code> is an <span class="emphasis"><em>interruption
8652                  point</em></span>.
8653                </p></dd>
8654</dl>
8655</div>
8656</div>
8657</div>
8658</div>
8659<div class="section">
8660<div class="titlepage"><div><div><h3 class="title">
8661<a name="thread.synchronization.latches"></a><a class="link" href="synchronization.html#thread.synchronization.latches" title="Latches -- EXPERIMENTAL">Latches -- EXPERIMENTAL</a>
8662</h3></div></div></div>
8663<div class="toc"><dl class="toc">
8664<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.introdcution">Introdcution</a></span></dt>
8665<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.examples">Examples</a></span></dt>
8666<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch">Class <code class="computeroutput"><span class="identifier">latch</span></code></a></span></dt>
8667</dl></div>
8668<div class="section">
8669<div class="titlepage"><div><div><h4 class="title">
8670<a name="thread.synchronization.latches.introdcution"></a><a class="link" href="synchronization.html#thread.synchronization.latches.introdcution" title="Introdcution">Introdcution</a>
8671</h4></div></div></div>
8672<p>
8673          Latches are a thread co-ordination mechanism that allow one or more threads
8674          to block until one or more threads have reached a point.
8675        </p>
8676</div>
8677<div class="section">
8678<div class="titlepage"><div><div><h4 class="title">
8679<a name="thread.synchronization.latches.examples"></a><a class="link" href="synchronization.html#thread.synchronization.latches.examples" title="Examples">Examples</a>
8680</h4></div></div></div>
8681<p>
8682          Sample use cases for the latch include:
8683        </p>
8684<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
8685<li class="listitem">
8686              Setting multiple threads to perform a task, and then waiting until
8687              all threads have reached a common point.
8688            </li>
8689<li class="listitem">
8690              Creating multiple threads, which wait for a signal before advancing
8691              beyond a common point.
8692            </li>
8693</ul></div>
8694<p>
8695          An example of the first use case would be as follows:
8696        </p>
8697<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">DoWork</span><span class="special">(</span><span class="identifier">thread_pool</span><span class="special">*</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span>
8698  <span class="identifier">latch</span> <span class="identifier">completion_latch</span><span class="special">(</span><span class="identifier">NTASKS</span><span class="special">);</span>
8699  <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&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>
8700    <span class="identifier">pool</span><span class="special">-&gt;</span><span class="identifier">submit</span><span class="special">([&amp;]</span> <span class="special">{</span>
8701      <span class="comment">// perform work</span>
8702      <span class="special">...</span>
8703      <span class="identifier">completion_latch</span><span class="special">.</span><span class="identifier">count_down</span><span class="special">();</span>
8704    <span class="special">}));</span>
8705  <span class="special">}</span>
8706  <span class="comment">// Block until work is done</span>
8707  <span class="identifier">completion_latch</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span>
8708<span class="special">}</span>
8709</pre>
8710<p>
8711          An example of the second use case is shown below. We need to load data
8712          and then process it using a number of threads. Loading the data is I/O
8713          bound, whereas starting threads and creating data structures is CPU bound.
8714          By running these in parallel, throughput can be increased.
8715        </p>
8716<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">DoWork</span><span class="special">()</span> <span class="special">{</span>
8717  <span class="identifier">latch</span> <span class="identifier">start_latch</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
8718  <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">thread</span><span class="special">*&gt;</span> <span class="identifier">workers</span><span class="special">;</span>
8719  <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&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>
8720    <span class="identifier">workers</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">thread</span><span class="special">([&amp;]</span> <span class="special">{</span>
8721      <span class="comment">// Initialize data structures. This is CPU bound.</span>
8722      <span class="special">...</span>
8723      <span class="identifier">start_latch</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span>
8724      <span class="comment">// perform work</span>
8725      <span class="special">...</span>
8726    <span class="special">}));</span>
8727  <span class="special">}</span>
8728  <span class="comment">// Load input data. This is I/O bound.</span>
8729  <span class="special">...</span>
8730  <span class="comment">// Threads can now start processing</span>
8731  <span class="identifier">start_latch</span><span class="special">.</span><span class="identifier">count_down</span><span class="special">();</span>
8732  <span class="special">}</span>
8733</pre>
8734</div>
8735<div class="section">
8736<div class="titlepage"><div><div><h4 class="title">
8737<a name="thread.synchronization.latches.latch"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch" title="Class latch">Class <code class="computeroutput"><span class="identifier">latch</span></code></a>
8738</h4></div></div></div>
8739<div class="toc"><dl class="toc">
8740<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.constructor__latch_std__size_t__">Constructor
8741          <code class="computeroutput"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)</span></code></a></span></dt>
8742<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.destructor___latch___">Destructor
8743          <code class="computeroutput"><span class="special">~</span><span class="identifier">latch</span><span class="special">()</span></code></a></span></dt>
8744<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait">Member
8745          Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a></span></dt>
8746<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.try_wait">Member
8747          Function <code class="computeroutput"><span class="identifier">try_wait</span><span class="special">()</span></code></a></span></dt>
8748<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait_for">Member
8749          Function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span>
8750          </code></a></span></dt>
8751<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.wait_until">Member
8752          Function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a></span></dt>
8753<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.count_down">Member
8754          Function <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code></a></span></dt>
8755<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.count_down_and_wait">Member
8756          Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a></span></dt>
8757<dt><span class="section"><a href="synchronization.html#thread.synchronization.latches.latch.reset">Member
8758          Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a></span></dt>
8759</dl></div>
8760<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
8761
8762<span class="keyword">class</span> <span class="identifier">latch</span>
8763<span class="special">{</span>
8764<span class="keyword">public</span><span class="special">:</span>
8765    <span class="identifier">latch</span><span class="special">(</span><span class="identifier">latch</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
8766    <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>
8767
8768    <span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">count</span><span class="special">);</span>
8769    <span class="special">~</span><span class="identifier">latch</span><span class="special">();</span>
8770
8771    <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
8772    <span class="keyword">bool</span> <span class="identifier">try_wait</span><span class="special">();</span>
8773    <span class="keyword">template</span> <span class="special">&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>
8774    <span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
8775    <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>
8776    <span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
8777    <span class="keyword">void</span> <span class="identifier">count_down</span><span class="special">();</span>
8778    <span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
8779
8780<span class="special">};</span>
8781</pre>
8782<p>
8783          A latch maintains an internal counter that is initialized when the latch
8784          is created. One or more threads may block waiting until the counter is
8785          decremented to 0.
8786        </p>
8787<p>
8788          Instances of <a class="link" href="synchronization.html#thread.synchronization.latches.latch" title="Class latch"><code class="computeroutput"><span class="identifier">latch</span></code></a> are not copyable or movable.
8789        </p>
8790<div class="section">
8791<div class="titlepage"><div><div><h5 class="title">
8792<a name="thread.synchronization.latches.latch.constructor__latch_std__size_t__"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.constructor__latch_std__size_t__" title="Constructor latch(std::size_t)">Constructor
8793          <code class="computeroutput"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)</span></code></a>
8794</h5></div></div></div>
8795<pre class="programlisting"><span class="identifier">latch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">count</span><span class="special">);</span>
8796</pre>
8797<div class="variablelist">
8798<p class="title"><b></b></p>
8799<dl class="variablelist">
8800<dt><span class="term">Effects:</span></dt>
8801<dd><p>
8802                  Construct a latch with is initial value for the internal counter.
8803                </p></dd>
8804<dt><span class="term">Note:</span></dt>
8805<dd><p>
8806                  The counter could be zero.
8807                </p></dd>
8808<dt><span class="term">Throws:</span></dt>
8809<dd><p>
8810                  Nothing.
8811                </p></dd>
8812</dl>
8813</div>
8814</div>
8815<div class="section">
8816<div class="titlepage"><div><div><h5 class="title">
8817<a name="thread.synchronization.latches.latch.destructor___latch___"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.destructor___latch___" title="Destructor ~latch()">Destructor
8818          <code class="computeroutput"><span class="special">~</span><span class="identifier">latch</span><span class="special">()</span></code></a>
8819</h5></div></div></div>
8820<pre class="programlisting"><span class="special">~</span><span class="identifier">latch</span><span class="special">();</span>
8821</pre>
8822<div class="variablelist">
8823<p class="title"><b></b></p>
8824<dl class="variablelist">
8825<dt><span class="term">Precondition:</span></dt>
8826<dd><p>
8827                  No threads are waiting or invoking count_down on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
8828                </p></dd>
8829<dt><span class="term">Effects:</span></dt>
8830<dd><p>
8831                  Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
8832                  latch.
8833                </p></dd>
8834<dt><span class="term">Throws:</span></dt>
8835<dd><p>
8836                  Nothing.
8837                </p></dd>
8838</dl>
8839</div>
8840</div>
8841<div class="section">
8842<div class="titlepage"><div><div><h5 class="title">
8843<a name="thread.synchronization.latches.latch.wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait" title="Member Function wait()">Member
8844          Function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
8845</h5></div></div></div>
8846<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">();</span>
8847</pre>
8848<div class="variablelist">
8849<p class="title"><b></b></p>
8850<dl class="variablelist">
8851<dt><span class="term">Effects:</span></dt>
8852<dd><p>
8853                  Block the calling thread until the internal count reaches the value
8854                  zero. Then all waiting threads are unblocked.
8855                </p></dd>
8856<dt><span class="term">Throws:</span></dt>
8857<dd>
8858<p>
8859                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8860                  occurs.
8861                </p>
8862<p>
8863                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8864                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8865                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8866                  with the current thread of execution.
8867                </p>
8868</dd>
8869<dt><span class="term">Notes:</span></dt>
8870<dd><p>
8871                  <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
8872                  is an <span class="emphasis"><em>interruption point</em></span>.
8873                </p></dd>
8874</dl>
8875</div>
8876</div>
8877<div class="section">
8878<div class="titlepage"><div><div><h5 class="title">
8879<a name="thread.synchronization.latches.latch.try_wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.try_wait" title="Member Function try_wait()">Member
8880          Function <code class="computeroutput"><span class="identifier">try_wait</span><span class="special">()</span></code></a>
8881</h5></div></div></div>
8882<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">try_wait</span><span class="special">();</span>
8883</pre>
8884<div class="variablelist">
8885<p class="title"><b></b></p>
8886<dl class="variablelist">
8887<dt><span class="term">Returns:</span></dt>
8888<dd><p>
8889                  Returns true if the internal count is 0, and false otherwise. Does
8890                  not block the calling thread.
8891                </p></dd>
8892<dt><span class="term">Throws:</span></dt>
8893<dd><p>
8894                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8895                  occurs.
8896                </p></dd>
8897</dl>
8898</div>
8899</div>
8900<div class="section">
8901<div class="titlepage"><div><div><h5 class="title">
8902<a name="thread.synchronization.latches.latch.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait_for" title="Member Function wait_for()">Member
8903          Function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span>
8904          </code></a>
8905</h5></div></div></div>
8906<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
8907<span class="identifier">cv_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
8908</pre>
8909<div class="variablelist">
8910<p class="title"><b></b></p>
8911<dl class="variablelist">
8912<dt><span class="term">Effects:</span></dt>
8913<dd><p>
8914                  Block the calling thread until the internal count reaches the value
8915                  zero or the duration has been elapsed. If no timeout, all waiting
8916                  threads are unblocked.
8917                </p></dd>
8918<dt><span class="term">Returns:</span></dt>
8919<dd><p>
8920                  cv_status::no_timeout if the internal count is 0, and cv_status::timeout
8921                  if duration has been elapsed.
8922                </p></dd>
8923<dt><span class="term">Throws:</span></dt>
8924<dd>
8925<p>
8926                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8927                  occurs.
8928                </p>
8929<p>
8930                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8931                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8932                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8933                  with the current thread of execution.
8934                </p>
8935</dd>
8936<dt><span class="term">Notes:</span></dt>
8937<dd><p>
8938                  <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code>
8939                  is an <span class="emphasis"><em>interruption point</em></span>.
8940                </p></dd>
8941</dl>
8942</div>
8943</div>
8944<div class="section">
8945<div class="titlepage"><div><div><h5 class="title">
8946<a name="thread.synchronization.latches.latch.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.wait_until" title="Member Function wait_until()">Member
8947          Function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
8948</h5></div></div></div>
8949<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
8950<span class="identifier">cv_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
8951</pre>
8952<div class="variablelist">
8953<p class="title"><b></b></p>
8954<dl class="variablelist">
8955<dt><span class="term">Effects:</span></dt>
8956<dd><p>
8957                  Block the calling thread until the internal count reaches the value
8958                  zero or the time_point has been reached. If no timeout, all waiting
8959                  threads are unblocked.
8960                </p></dd>
8961<dt><span class="term">Returns:</span></dt>
8962<dd><p>
8963                  cv_status::no_timeout if the internal count is 0, and cv_status::timeout
8964                  if time_point has been reached.
8965                </p></dd>
8966<dt><span class="term">Throws:</span></dt>
8967<dd>
8968<p>
8969                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
8970                  occurs.
8971                </p>
8972<p>
8973                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
8974                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
8975                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
8976                  with the current thread of execution.
8977                </p>
8978</dd>
8979<dt><span class="term">Notes:</span></dt>
8980<dd><p>
8981                  <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code>
8982                  is an <span class="emphasis"><em>interruption point</em></span>.
8983                </p></dd>
8984</dl>
8985</div>
8986</div>
8987<div class="section">
8988<div class="titlepage"><div><div><h5 class="title">
8989<a name="thread.synchronization.latches.latch.count_down"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.count_down" title="Member Function count_down()">Member
8990          Function <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code></a>
8991</h5></div></div></div>
8992<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down</span><span class="special">();</span>
8993</pre>
8994<div class="variablelist">
8995<p class="title"><b></b></p>
8996<dl class="variablelist">
8997<dt><span class="term">Requires:</span></dt>
8998<dd><p>
8999                  The internal counter is non zero.
9000                </p></dd>
9001<dt><span class="term">Effects:</span></dt>
9002<dd><p>
9003                  Decrements the internal count by 1, and returns. If the count reaches
9004                  0, any threads blocked in wait() will be released.
9005                </p></dd>
9006<dt><span class="term">Throws:</span></dt>
9007<dd>
9008<p>
9009                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9010                  occurs.
9011                </p>
9012<p>
9013                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
9014                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
9015                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
9016                  with the current thread of execution.
9017                </p>
9018</dd>
9019<dt><span class="term">Notes:</span></dt>
9020<dd><p>
9021                  <code class="computeroutput"><span class="identifier">count_down</span><span class="special">()</span></code>
9022                  is an <span class="emphasis"><em>interruption point</em></span>.
9023                </p></dd>
9024</dl>
9025</div>
9026</div>
9027<div class="section">
9028<div class="titlepage"><div><div><h5 class="title">
9029<a name="thread.synchronization.latches.latch.count_down_and_wait"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.count_down_and_wait" title="Member Function count_down_and_wait()">Member
9030          Function <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code></a>
9031</h5></div></div></div>
9032<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">count_down_and_wait</span><span class="special">();</span>
9033</pre>
9034<div class="variablelist">
9035<p class="title"><b></b></p>
9036<dl class="variablelist">
9037<dt><span class="term">Requires:</span></dt>
9038<dd><p>
9039                  The internal counter is non zero.
9040                </p></dd>
9041<dt><span class="term">Effects:</span></dt>
9042<dd><p>
9043                  Decrements the internal count by 1. If the resulting count is not
9044                  0, blocks the calling thread until the internal count is decremented
9045                  to 0 by one or more other threads calling count_down() or count_down_and_wait().
9046                </p></dd>
9047<dt><span class="term">Throws:</span></dt>
9048<dd>
9049<p>
9050                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9051                  occurs.
9052                </p>
9053<p>
9054                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the wait
9055                  was interrupted by a call to <a class="link" href="thread_management.html#thread.thread_management.thread.interrupt" title="Member function interrupt() EXTENSION"><code class="computeroutput"><span class="identifier">interrupt</span><span class="special">()</span></code></a>
9056                  on the <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code></a> object associated
9057                  with the current thread of execution.
9058                </p>
9059</dd>
9060<dt><span class="term">Notes:</span></dt>
9061<dd><p>
9062                  <code class="computeroutput"><span class="identifier">count_down_and_wait</span><span class="special">()</span></code> is an <span class="emphasis"><em>interruption
9063                  point</em></span>.
9064                </p></dd>
9065</dl>
9066</div>
9067</div>
9068<p>
9069          [
9070        </p>
9071<div class="section">
9072<div class="titlepage"><div><div><h5 class="title">
9073<a name="thread.synchronization.latches.latch.reset"></a><a class="link" href="synchronization.html#thread.synchronization.latches.latch.reset" title="Member Function reset()">Member
9074          Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a>
9075</h5></div></div></div>
9076<pre class="programlisting"><span class="identifier">reset</span><span class="special">(</span> <span class="identifier">size_t</span> <span class="special">);</span>
9077</pre>
9078<div class="variablelist">
9079<p class="title"><b></b></p>
9080<dl class="variablelist">
9081<dt><span class="term">Requires:</span></dt>
9082<dd><p>
9083                  This function may only be invoked when there are no other threads
9084                  currently inside the waiting functions.
9085                </p></dd>
9086<dt><span class="term">Returns:</span></dt>
9087<dd><p>
9088                  Resets the latch with a new value for the initial thread count.
9089                </p></dd>
9090<dt><span class="term">Throws:</span></dt>
9091<dd><p>
9092                  - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_resource_error</span></code> if an error
9093                  occurs.
9094                </p></dd>
9095</dl>
9096</div>
9097</div>
9098<p>
9099          ]
9100        </p>
9101</div>
9102</div>
9103<div class="section">
9104<div class="titlepage"><div><div><h3 class="title">
9105<a name="thread.synchronization.executors"></a><a class="link" href="synchronization.html#thread.synchronization.executors" title="Executors and Schedulers -- EXPERIMENTAL">Executors and Schedulers
9106      -- EXPERIMENTAL</a>
9107</h3></div></div></div>
9108<div class="toc"><dl class="toc">
9109<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.introduction">Introduction</a></span></dt>
9110<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.examples">Examples</a></span></dt>
9111<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.rationale">Design
9112        Rationale</a></span></dt>
9113<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref">Reference</a></span></dt>
9114</dl></div>
9115<div class="warning"><table border="0" summary="Warning">
9116<tr>
9117<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
9118<th align="left">Warning</th>
9119</tr>
9120<tr><td align="left" valign="top"><p>
9121          These features are experimental and subject to change in future versions.
9122          There are not too much tests yet, so it is possible that you can find out
9123          some trivial bugs :(
9124        </p></td></tr>
9125</table></div>
9126<div class="note"><table border="0" summary="Note">
9127<tr>
9128<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
9129<th align="left">Note</th>
9130</tr>
9131<tr><td align="left" valign="top"><p>
9132          These features are based on the <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3785.pdf" target="_top"><span class="bold"><strong>N3785 - Executors and Schedulers revision 3</strong></span></a>
9133          C++1y proposal from Chris Mysen, Niklas Gustafsson, Matt Austern, Jeffrey
9134          Yasskin. The text that follows has been adapted from this paper to show
9135          the differences.
9136        </p></td></tr>
9137</table></div>
9138<p>
9139        Executors are objects that can execute units of work packaged as function
9140        objects. Boost.Thread differs from N3785 mainly in the an Executor doesn't
9141        needs to inherit from an abstract class Executor. Static polymorphism is
9142        used instead and type erasure is used internally.
9143      </p>
9144<div class="section">
9145<div class="titlepage"><div><div><h4 class="title">
9146<a name="thread.synchronization.executors.introduction"></a><a class="link" href="synchronization.html#thread.synchronization.executors.introduction" title="Introduction">Introduction</a>
9147</h4></div></div></div>
9148<p>
9149          Multithreaded programs often involve discrete (sometimes small) units of
9150          work that are executed asynchronously. This often involves passing work
9151          units to some component that manages execution. We already have boost::async,
9152          which potentially executes a function asynchronously and eventually returns
9153          its result in a future. (“As if” by launching a new thread.)
9154        </p>
9155<p>
9156          If there is a regular stream of small work items then we almost certainly
9157          don’t want to launch a new thread for each, and it’s likely that we
9158          want at least some control over which thread(s) execute which items. It
9159          is often convenient to represent that control as multiple executor objects.
9160          This allows programs to start executors when necessary, switch from one
9161          executor to another to control execution policy, and use multiple executors
9162          to prevent interference and thread exhaustion. Several possible implementations
9163          exist of the executor class and in practice there are a number of main
9164          groups of executors which have been found to be useful in real-world code
9165          (more implementations exist, this is simply a high level classification
9166          of them). These differ along a couple main dimensions, how many execution
9167          contexts will be used, how they are selected, and how they are prioritized.
9168        </p>
9169<div class="orderedlist"><ol class="orderedlist" type="1">
9170<li class="listitem">
9171              Thread Pools
9172              <div class="orderedlist"><ol class="orderedlist" type="a">
9173<li class="listitem">
9174                    Simple unbounded thread pool, which can queue up an unbounded
9175                    amount of work and maintains a dedicated set of threads (up to
9176                    some maximum) which dequeue and execute work as available.
9177                  </li>
9178<li class="listitem">
9179                    Bounded thread pools, which can be implemented as a specialization
9180                    of the previous ones with a bounded queue or semaphore, which
9181                    limits the amount of queuing in an attempt to bound the time
9182                    spent waiting to execute and/or limit resource utilization for
9183                    work tasks which hold state which is expensive to hold.
9184                  </li>
9185<li class="listitem">
9186                    Thread-spawning executors, in which each work always executes
9187                    in a new thread.
9188                  </li>
9189<li class="listitem">
9190                    Prioritized thread pools, which have works which are not equally
9191                    prioritized such that work can move to the front of the execution
9192                    queue if necessary. This requires a special comparator or prioritization
9193                    function to allow for work ordering and normally is implemented
9194                    as a blocking priority queue in front of the pool instead of
9195                    a blocking queue. This has many uses but is a somewhat specialized
9196                    in nature and would unnecessarily clutter the initial interface.
9197                  </li>
9198<li class="listitem">
9199                    Work stealing thread pools, this is a specialized use case and
9200                    is encapsulated in the ForkJoinPool in java, which allows lightweight
9201                    work to be created by tasks in the pool and either run by the
9202                    same thread for invocation efficiency or stolen by another thread
9203                    without additional work. These have been left out until there
9204                    is a more concrete fork-join proposal or until there is a more
9205                    clear need as these can be complicated to implement
9206                  </li>
9207</ol></div>
9208            </li>
9209<li class="listitem">
9210              Mutual exclusion executors
9211              <div class="orderedlist"><ol class="orderedlist" type="a">
9212<li class="listitem">
9213                    Serial executors, which guarantee all work to be executed such
9214                    that no two works will execute concurrently. This allows for
9215                    a sequence of operations to be queued in sequence and that sequential
9216                    order is maintained and work can be queued on a separate thread
9217                    but with no mutual exclusion required.
9218                  </li>
9219<li class="listitem">
9220                    Loop executor, in which one thread donates itself to the executor
9221                    to execute all queued work. This is related to the serial executor
9222                    in that it guarantees mutual exclusion, but instead guarantees
9223                    a particular thread will execute the work. These are particularly
9224                    useful for testing purposes where code assumes an executor but
9225                    testing code desires control over execution.
9226                  </li>
9227<li class="listitem">
9228                    GUI thread executor, where a GUI framework can expose an executor
9229                    interface to allow other threads to queue up work to be executed
9230                    as part of the GUI thread. This behaves similarly to a loop executor,
9231                    but must be implemented as a custom interface as part of the
9232                    framework.
9233                  </li>
9234</ol></div>
9235            </li>
9236<li class="listitem">
9237              Inline executors, which execute inline to the thread which calls submit().
9238              This has no queuing and behaves like a normal executor, but always
9239              uses the caller’s thread to execute. This allows parallel execution
9240              of works, though. This type of executor is often useful when there
9241              is an executor required by an interface, but when for performance reasons
9242              it’s better not to queue work or switch threads. This is often very
9243              useful as an optimization for work continuations which should execute
9244              immediately or quickly and can also be useful for optimizations when
9245              an interface requires an executor but the work tasks are too small
9246              to justify the overhead of a full thread pool.
9247            </li>
9248</ol></div>
9249<p>
9250          A question arises of which of these executors (or others) be included in
9251          this library. There are use cases for these and many other executors. Often
9252          it is useful to have more than one implemented executor (e.g. the thread
9253          pool) to have more precise control of where the work is executed due to
9254          the existence of a GUI thread, or for testing purposes. A few core executors
9255          are frequently useful and these have been outlined here as the core of
9256          what should be in this library, if common use cases arise for alternative
9257          executor implementations, they can be added in the future. The current
9258          set provided here are: a basic thread pool <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code>,
9259          a serial executor <code class="computeroutput"><span class="identifier">serial_executor</span></code>,
9260          a loop executor <code class="computeroutput"><span class="identifier">loop_executor</span></code>,
9261          an inline executor <code class="computeroutput"><span class="identifier">inline_executor</span></code>
9262          and a thread-spawning executor <code class="computeroutput"><span class="identifier">thread_executor</span></code>.
9263        </p>
9264</div>
9265<div class="section">
9266<div class="titlepage"><div><div><h4 class="title">
9267<a name="thread.synchronization.executors.examples"></a><a class="link" href="synchronization.html#thread.synchronization.executors.examples" title="Examples">Examples</a>
9268</h4></div></div></div>
9269<div class="toc"><dl class="toc"><dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.examples.quick_sort">Parallel
9270          Quick Sort</a></span></dt></dl></div>
9271<div class="section">
9272<div class="titlepage"><div><div><h5 class="title">
9273<a name="thread.synchronization.executors.examples.quick_sort"></a><a class="link" href="synchronization.html#thread.synchronization.executors.examples.quick_sort" title="Parallel Quick Sort">Parallel
9274          Quick Sort</a>
9275</h5></div></div></div>
9276<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
9277<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>
9278<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">numeric</span><span class="special">&gt;</span>
9279<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">algorithm</span><span class="special">&gt;</span>
9280<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">functional</span><span class="special">&gt;</span>
9281<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
9282<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">list</span><span class="special">&gt;</span>
9283
9284<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>
9285<span class="keyword">struct</span> <span class="identifier">sorter</span>
9286<span class="special">{</span>
9287    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">;</span>
9288    <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">return_type</span><span class="special">;</span>
9289
9290    <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&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>
9291    <span class="special">{</span>
9292        <span class="keyword">if</span><span class="special">(</span><span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
9293            <span class="keyword">return</span> <span class="identifier">chunk_data</span><span class="special">;</span>
9294        <span class="special">}</span>
9295
9296        <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">result</span><span class="special">;</span>
9297        <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">chunk_data</span><span class="special">,</span> <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
9298        <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&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>
9299
9300        <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>
9301            <span class="identifier">std</span><span class="special">::</span><span class="identifier">partition</span><span class="special">(</span><span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span>
9302                           <span class="special">[&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>
9303
9304        <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>
9305        <span class="identifier">new_lower_chunk</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">new_lower_chunk</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">chunk_data</span><span class="special">,</span>
9306                               <span class="identifier">chunk_data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">divide_point</span><span class="special">);</span>
9307        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&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>
9308             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span><span class="special">(</span><span class="identifier">pool</span><span class="special">,</span> <span class="special">&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>
9309        <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>
9310        <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span><span class="identifier">new_higher</span><span class="special">);</span>
9311        <span class="keyword">while</span><span class="special">(!</span><span class="identifier">new_lower</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">())</span> <span class="special">{</span>
9312            <span class="identifier">pool</span><span class="special">.</span><span class="identifier">schedule_one_or_yield</span><span class="special">();</span>
9313        <span class="special">}</span>
9314        <span class="identifier">result</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span><span class="identifier">new_lower</span><span class="special">.</span><span class="identifier">get</span><span class="special">());</span>
9315        <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
9316    <span class="special">}</span>
9317<span class="special">};</span>
9318
9319<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
9320<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>
9321    <span class="keyword">if</span><span class="special">(</span><span class="identifier">input</span><span class="special">.</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
9322        <span class="keyword">return</span> <span class="identifier">input</span><span class="special">;</span>
9323    <span class="special">}</span>
9324    <span class="identifier">sorter</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">;</span>
9325    <span class="keyword">return</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">do_sort</span><span class="special">(</span><span class="identifier">input</span><span class="special">);</span>
9326<span class="special">}</span>
9327</pre>
9328</div>
9329</div>
9330<div class="section">
9331<div class="titlepage"><div><div><h4 class="title">
9332<a name="thread.synchronization.executors.rationale"></a><a class="link" href="synchronization.html#thread.synchronization.executors.rationale" title="Design Rationale">Design
9333        Rationale</a>
9334</h4></div></div></div>
9335<p>
9336          The authors of Boost.Thread have taken a different approach respect to
9337          N3785. Instead of basing all the design on an abstract executor class we
9338          make executor concepts. We believe that this is the good direction as a
9339          static polymorphic executor can be seen as a dynamic polymorphic executor
9340          using a simple adaptor. We believe also that it would make the library
9341          more usable, and more convenient for users.
9342        </p>
9343<p>
9344          The major design decisions concern deciding what a unit of work is, how
9345          to manage with units of work and time related functions in a polymorphic
9346          way.
9347        </p>
9348<p>
9349          An Executor is an object that schedules the closures that have been submitted
9350          to it, usually asynchronously. There could be multiple models of the Executor
9351          class. Some specific design notes:
9352        </p>
9353<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9354<li class="listitem">
9355              Thread pools are well know models of the Executor concept, and this
9356              library does indeed include a basic_thread_pool class, but other implementations
9357              also exist, including the ability to schedule work on GUI threads,
9358              scheduling work on a donor thread, as well as several specializations
9359              of thread pools.
9360            </li>
9361<li class="listitem">
9362              The choice of which executor to use is explicit. This is important
9363              for reasons described in the Motivation section. In particular, consider
9364              the common case of an asynchronous operation that itself spawns asynchronous
9365              operations. If both operations ran on the same executor, and if that
9366              executor had a bounded number of worker threads, then we could get
9367              deadlock. Programs often deal with such issues by splitting different
9368              kinds of work between different executors.
9369            </li>
9370<li class="listitem">
9371              Even if there could be a strong value in having a default executor,
9372              that can be used when detailed control is unnecessary, the authors
9373              don't know how to implement it in a portable and robust way.
9374            </li>
9375<li class="listitem">
9376              The library provides Executors based on static and dynamic polymorphism.
9377              The static polymorphism interface is intended to be used on contexts
9378              that need to have the best performances. The dynamic polymorphism interface
9379              has the advantage to been able to change the executor a function is
9380              using without making it a template and is possible to pass executors
9381              across a binary interface. For some applications, the cost of an additional
9382              virtual dispatch could be almost certainly negligible compared to the
9383              other operations involved.
9384            </li>
9385<li class="listitem">
9386              Conceptually, an executor puts closures on a queue and at some point
9387              executes them. The queue is always unbounded, so adding a closure to
9388              an executor never blocks. (Defining “never blocks” formally is
9389              challenging, but informally we just mean that submit() is an ordinary
9390              function that executes something and returns, rather than waiting for
9391              the completion of some potentially long running operation in another
9392              thread.)
9393            </li>
9394</ul></div>
9395<h6>
9396<a name="thread.synchronization.executors.rationale.h0"></a>
9397          <span class="phrase"><a name="thread.synchronization.executors.rationale.closure"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.closure">Closure</a>
9398        </h6>
9399<p>
9400          One important question is just what a closure is. This library has a very
9401          simple answer: a closure is a <code class="computeroutput"><span class="identifier">Callable</span></code>
9402          with no parameters and returning <code class="computeroutput"><span class="keyword">void</span></code>.
9403        </p>
9404<p>
9405          N3785 choose the more specific <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span></code> as it provides only dynamic polymorphism
9406          and states that in practice the implementation of a template based approach
9407          or another approach is impractical. The authors of this library think that
9408          the template based approach is compatible with a dynamic based approach.
9409          They give some arguments:
9410        </p>
9411<p>
9412          The first one is that a virtual function can not be a template. This is
9413          true but it is also true that the executor interface can provide the template
9414          functions that call to the virtual public functions. Another reason they
9415          give is that "a template parameter would complicate the interface
9416          without adding any real generality. In the end an executor class is going
9417          to need some kind of type erasure to handle all the different kinds of
9418          function objects with <code class="computeroutput"><span class="keyword">void</span><span class="special">()</span></code> signature, and that’s exactly what
9419          std::function already does". We think that it is up to the executor
9420          to manage with this implementation details, not to the user.
9421        </p>
9422<p>
9423          We share all the argument they give related to the <code class="computeroutput"><span class="keyword">void</span><span class="special">()</span></code> interface of the work unit. A work unit
9424          is a closure that takes no arguments and returns no value. This is indeed
9425          a limitation on user code, but combined with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code>
9426          taking executors as parameters the user has all what she needs.
9427        </p>
9428<p>
9429          The third one is related to performance. They assert that "any mechanism
9430          for storing closures on an executor’s queue will have to use some form
9431          of type erasure. There’s no reason to believe that a custom closure mechanism,
9432          written just for std::executor and used nowhere else within the standard
9433          library, would be better in that respect than <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span></code>". We believe that the implementation
9434          can do better that storing the closure on a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span></code>. e.g. the implementation can use
9435          intrusive data to store the closure and the pointers to other nodes needed
9436          to store the closures in a given order.
9437        </p>
9438<p>
9439          In addition <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span></code>
9440          can not be constructed by moving the closure, so e.g. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">packaged_task</span></code>
9441          could not be a Closure.
9442        </p>
9443<h6>
9444<a name="thread.synchronization.executors.rationale.h1"></a>
9445          <span class="phrase"><a name="thread.synchronization.executors.rationale.scheduled_work"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.scheduled_work">Scheduled
9446          work</a>
9447        </h6>
9448<p>
9449          The approach of this library respect to scheduled work of the N3785 proposal
9450          is quite different. Instead of adding the scheduled operations to a specific
9451          scheduled_executor polymorphic interface, we opt by adding a specific
9452          <code class="computeroutput"><span class="identifier">scheduler</span></code> class that is
9453          not an executor and knows how to manage with the scheduling of timed tasks
9454          <code class="computeroutput"><span class="identifier">submit_at</span></code>/<code class="computeroutput"><span class="identifier">submit_after</span></code>.
9455        </p>
9456<p>
9457          <code class="computeroutput"><span class="identifier">scheduler</span></code> provides executor
9458          factories <code class="computeroutput"><span class="identifier">at</span></code>/<code class="computeroutput"><span class="identifier">after</span></code> given a specific <code class="computeroutput"><span class="identifier">time_point</span></code> or a <code class="computeroutput"><span class="identifier">duration</span></code>.
9459          The built executors wrap a reference to this scheduler and the time at
9460          which the submitted task will be executed.
9461        </p>
9462<p>
9463          If we want to schedule these operations on an existing executor (as <code class="computeroutput"><span class="identifier">serial_executor</span></code> does), these classes
9464          provide a <code class="computeroutput"><span class="identifier">on</span></code> factory taking
9465          another executor as parameter and wraps both instance on the returned executor.
9466        </p>
9467<pre class="programlisting"><span class="identifier">sch</span><span class="special">.</span><span class="identifier">on</span><span class="special">(</span><span class="identifier">tp</span><span class="special">).</span><span class="identifier">after</span><span class="special">(</span><span class="identifier">seconds</span><span class="special">(</span><span class="identifier">i</span><span class="special">)).</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">fn</span><span class="special">,</span><span class="identifier">i</span><span class="special">));</span>
9468</pre>
9469<p>
9470          This has several advantages:
9471        </p>
9472<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9473<li class="listitem">
9474              The scheduled operations are available for all the executors via wrappers.
9475            </li>
9476<li class="listitem">
9477              The template functions could accept any chrono <code class="computeroutput"><span class="identifier">time_point</span></code>
9478              and <code class="computeroutput"><span class="identifier">duration</span></code> respectively
9479              as we are not working with virtual functions.
9480            </li>
9481</ul></div>
9482<p>
9483          In order to manage with all the clocks, this library propose generic solution.
9484          <code class="computeroutput"><span class="identifier">scheduler</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">&gt;</span></code>
9485          know how to manage with the <code class="computeroutput"><span class="identifier">submit_at</span></code>/<code class="computeroutput"><span class="identifier">submit_after</span></code> <code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">time_point</span></code>/<code class="computeroutput"><span class="identifier">Clock</span><span class="special">::</span><span class="identifier">duration</span></code> tasks. Note that the durations
9486          on different clocks differ.
9487        </p>
9488<h6>
9489<a name="thread.synchronization.executors.rationale.h2"></a>
9490          <span class="phrase"><a name="thread.synchronization.executors.rationale.not_handled_exceptions"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.not_handled_exceptions">Not
9491          Handled Exceptions</a>
9492        </h6>
9493<p>
9494          As in N3785 and based on the same design decision than <code class="computeroutput"><span class="identifier">std</span></code>/<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span></code> if a user closure throws an exception,
9495          the executor must call the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
9496          function. Note that when we combine <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code>
9497          and <code class="computeroutput"><span class="identifier">Executors</span></code>, the exception
9498          will be caught by the closure associated to the returned future, so that
9499          the exception is stored on the returned future, as for the other <code class="computeroutput"><span class="identifier">async</span></code> overloads.
9500        </p>
9501<h6>
9502<a name="thread.synchronization.executors.rationale.h3"></a>
9503          <span class="phrase"><a name="thread.synchronization.executors.rationale.at_thread_entry"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.at_thread_entry">At
9504          thread entry</a>
9505        </h6>
9506<p>
9507          It is common idiom to set some thread local variable at the beginning of
9508          a thread. As Executors could instantiate threads internally these Executors
9509          shall have the ability to call a user specific function at thread entry
9510          on the executor constructor.
9511        </p>
9512<p>
9513          For executors that don't instantiate any thread and that would use the
9514          current thread this function shall be called only for the thread calling
9515          the <code class="computeroutput"><span class="identifier">at_thread_entry</span></code> member
9516          function.
9517        </p>
9518<h6>
9519<a name="thread.synchronization.executors.rationale.h4"></a>
9520          <span class="phrase"><a name="thread.synchronization.executors.rationale.cancelation"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.cancelation">Cancelation</a>
9521        </h6>
9522<p>
9523          The library does not provision yet for the ability to cancel/interrupt
9524          work, though this is a commonly requested feature.
9525        </p>
9526<p>
9527          This could be managed externally by an additional cancelation object that
9528          can be shared between the creator of the unit of work and the unit of work.
9529        </p>
9530<p>
9531          We can think also of a cancelable closure that could be used in a more
9532          transparent way.
9533        </p>
9534<p>
9535          An alternative is to make async return a cancelable_task but this will
9536          need also a cancelable closure.
9537        </p>
9538<h6>
9539<a name="thread.synchronization.executors.rationale.h5"></a>
9540          <span class="phrase"><a name="thread.synchronization.executors.rationale.current_executor"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.current_executor">Current
9541          executor</a>
9542        </h6>
9543<p>
9544          The library does not provision for the ability to get the current executor,
9545          though having access to it could simplify a lot the user code.
9546        </p>
9547<p>
9548          The reason is that the user can always use a thread_local variable and
9549          reset it using the <code class="computeroutput"><span class="identifier">at_thread_entry</span>
9550          </code> member function.
9551        </p>
9552<pre class="programlisting"><span class="keyword">thread_local</span> <span class="identifier">current_executor_state_type</span> <span class="identifier">current_executor_state</span><span class="special">;</span>
9553<span class="identifier">executor</span><span class="special">*</span> <span class="identifier">current_executor</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">current_executor_state</span><span class="special">.</span><span class="identifier">current_executor</span><span class="special">();</span> <span class="special">}</span>
9554<span class="identifier">basic_thread_pool</span> <span class="identifier">pool</span><span class="special">(</span>
9555	<span class="comment">// at_thread_entry</span>
9556	<span class="special">[](</span><span class="identifier">basic_thread_pool</span><span class="special">&amp;</span> <span class="identifier">pool</span><span class="special">)</span> <span class="special">{</span>
9557		<span class="identifier">current_executor_state</span><span class="special">.</span><span class="identifier">set_current_executor</span><span class="special">(</span><span class="identifier">pool</span><span class="special">);</span>
9558	<span class="special">}</span>
9559<span class="special">);</span>
9560</pre>
9561<p>
9562          [
9563        </p>
9564<h6>
9565<a name="thread.synchronization.executors.rationale.h6"></a>
9566          <span class="phrase"><a name="thread.synchronization.executors.rationale.default_executor"></a></span><a class="link" href="synchronization.html#thread.synchronization.executors.rationale.default_executor">Default
9567          executor</a>
9568        </h6>
9569<p>
9570          The library authors share some of the concerns of the C++ standard committee
9571          (introduction of a new single shared resource, a singleton, could make
9572          it difficult to make it portable to all the environments) and that this
9573          library doesn't need to provide a default executor for the time been.
9574        </p>
9575<p>
9576          The user can always define his default executor himself.
9577        </p>
9578<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">generic_executor_ref</span> <span class="identifier">default_executor</span><span class="special">()</span>
9579<span class="special">{</span>
9580    <span class="keyword">static</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">basic_thread_pool</span> <span class="identifier">tp</span><span class="special">(</span><span class="number">4</span><span class="special">);</span>
9581    <span class="keyword">return</span> <span class="identifier">generic_executor_ref</span><span class="special">(</span><span class="identifier">tp</span><span class="special">);</span>
9582<span class="special">}</span>
9583</pre>
9584</div>
9585<div class="section">
9586<div class="titlepage"><div><div><h4 class="title">
9587<a name="thread.synchronization.executors.ref"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref" title="Reference">Reference</a>
9588</h4></div></div></div>
9589<div class="toc"><dl class="toc">
9590<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.concept_closure">Concept
9591          <code class="computeroutput"><span class="identifier">Closure</span></code></a></span></dt>
9592<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.concept_executor">Concept
9593          <code class="computeroutput"><span class="identifier">Executor</span></code></a></span></dt>
9594<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.work">Class
9595          <code class="computeroutput"><span class="identifier">work</span></code></a></span></dt>
9596<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.executor">Class
9597          <code class="computeroutput"><span class="identifier">executor</span></code></a></span></dt>
9598<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor">Template
9599          Class <code class="computeroutput"><span class="identifier">executor_adaptor</span></code></a></span></dt>
9600<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.generic_executor_ref">Class
9601          <code class="computeroutput"><span class="identifier">generic_executor_ref</span></code></a></span></dt>
9602<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.scheduler">Template
9603          Class <code class="computeroutput"><span class="identifier">scheduler</span> </code></a></span></dt>
9604<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.at_executor">Template
9605          Class <code class="computeroutput"><span class="identifier">at_executor</span></code></a></span></dt>
9606<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper">Template
9607          Class <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span></code></a></span></dt>
9608<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor">Template
9609          Class <code class="computeroutput"><span class="identifier">resubmit_at_executor</span></code></a></span></dt>
9610<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.serial_executor">Template
9611          Class <code class="computeroutput"><span class="identifier">serial_executor</span></code></a></span></dt>
9612<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.inline_executor">Class
9613          <code class="computeroutput"><span class="identifier">inline_executor</span></code></a></span></dt>
9614<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool">Class
9615          <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code></a></span></dt>
9616<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.thread_executor">Class
9617          <code class="computeroutput"><span class="identifier">thread_executor</span></code></a></span></dt>
9618<dt><span class="section"><a href="synchronization.html#thread.synchronization.executors.ref.loop_executor">Class
9619          <code class="computeroutput"><span class="identifier">loop_executor</span></code></a></span></dt>
9620</dl></div>
9621<div class="section">
9622<div class="titlepage"><div><div><h5 class="title">
9623<a name="thread.synchronization.executors.ref.concept_closure"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_closure" title="Concept Closure">Concept
9624          <code class="computeroutput"><span class="identifier">Closure</span></code></a>
9625</h5></div></div></div>
9626<p>
9627            A type <code class="computeroutput"><span class="identifier">E</span></code> meets the <code class="computeroutput"><span class="identifier">Closure</span></code> requirements if is a model
9628            of <code class="computeroutput"><span class="identifier">Callable</span><span class="special">(</span><span class="keyword">void</span><span class="special">())</span></code>
9629            and a model of <code class="computeroutput"><span class="identifier">CopyConstructible</span></code>/<code class="computeroutput"><span class="identifier">MoveConstructible</span></code>.
9630          </p>
9631</div>
9632<div class="section">
9633<div class="titlepage"><div><div><h5 class="title">
9634<a name="thread.synchronization.executors.ref.concept_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor" title="Concept Executor">Concept
9635          <code class="computeroutput"><span class="identifier">Executor</span></code></a>
9636</h5></div></div></div>
9637<p>
9638            The <code class="computeroutput"><span class="identifier">Executor</span></code> concept
9639            models the common operations of all the executors.
9640          </p>
9641<p>
9642            A type <code class="computeroutput"><span class="identifier">E</span></code> meets the <code class="computeroutput"><span class="identifier">Executor</span></code> requirements if the following
9643            expressions are well-formed and have the specified semantics
9644          </p>
9645<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9646<li class="listitem">
9647                <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">lc</span><span class="special">);</span></code>
9648              </li>
9649<li class="listitem">
9650                <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">rc</span><span class="special">);</span></code>
9651              </li>
9652<li class="listitem">
9653                <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code>
9654              </li>
9655<li class="listitem">
9656                <code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span>
9657                <span class="identifier">e</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code>
9658              </li>
9659<li class="listitem">
9660                <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">try_executing_one</span><span class="special">();</span></code>
9661              </li>
9662<li class="listitem">
9663                <code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code>
9664              </li>
9665</ul></div>
9666<p>
9667            where
9668          </p>
9669<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
9670<li class="listitem">
9671                <code class="computeroutput"><span class="identifier">e</span></code> denotes a value
9672                of type <code class="computeroutput"><span class="identifier">E</span></code>,
9673              </li>
9674<li class="listitem">
9675                <code class="computeroutput"><span class="identifier">lc</span></code> denotes a lvalue
9676                reference of type <code class="computeroutput"><span class="identifier">Closure</span></code>,
9677              </li>
9678<li class="listitem">
9679                <code class="computeroutput"><span class="identifier">rc</span></code> denotes a rvalue
9680                reference of type <code class="computeroutput"><span class="identifier">Closure</span></code>
9681              </li>
9682<li class="listitem">
9683                <code class="computeroutput"><span class="identifier">p</span></code> denotes a value
9684                of type <code class="computeroutput"><span class="identifier">Predicate</span></code>
9685              </li>
9686</ul></div>
9687<div class="section">
9688<div class="titlepage"><div><div><h6 class="title">
9689<a name="thread.synchronization.executors.ref.concept_executor.submitlc"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.submitlc" title="e.submit(lc);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">lc</span><span class="special">);</span></code></a>
9690</h6></div></div></div>
9691<div class="variablelist">
9692<p class="title"><b></b></p>
9693<dl class="variablelist">
9694<dt><span class="term">Effects:</span></dt>
9695<dd><p>
9696                    The specified closure will be scheduled for execution at some
9697                    point in the future. If invoked closure throws an exception the
9698                    executor will call std::terminate, as is the case with threads.
9699                  </p></dd>
9700<dt><span class="term">Synchronization:</span></dt>
9701<dd><p>
9702                    completion of closure on a particular thread happens before destruction
9703                    of thread's thread local variables.
9704                  </p></dd>
9705<dt><span class="term">Return type:</span></dt>
9706<dd><p>
9707                    <code class="computeroutput"><span class="keyword">void</span></code>.
9708                  </p></dd>
9709<dt><span class="term">Throws:</span></dt>
9710<dd><p>
9711                    sync_queue_is_closed if the thread pool is closed. Whatever exception
9712                    that can be throw while storing the closure.
9713                  </p></dd>
9714<dt><span class="term">Exception safety:</span></dt>
9715<dd><p>
9716                    If an exception is thrown then the executor state is unmodified.
9717                  </p></dd>
9718</dl>
9719</div>
9720</div>
9721<div class="section">
9722<div class="titlepage"><div><div><h6 class="title">
9723<a name="thread.synchronization.executors.ref.concept_executor.submitrc"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.submitrc" title="e.submit(rc);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">submit</span><span class="special">(</span><span class="identifier">rc</span><span class="special">);</span></code></a>
9724</h6></div></div></div>
9725<div class="variablelist">
9726<p class="title"><b></b></p>
9727<dl class="variablelist">
9728<dt><span class="term">Effects:</span></dt>
9729<dd><p>
9730                    The specified closure will be scheduled for execution at some
9731                    point in the future. If invoked closure throws an exception the
9732                    executor will call std::terminate, as is the case with threads.
9733                  </p></dd>
9734<dt><span class="term">Synchronization:</span></dt>
9735<dd><p>
9736                    completion of closure on a particular thread happens before destruction
9737                    of thread's thread local variables.
9738                  </p></dd>
9739<dt><span class="term">Return type:</span></dt>
9740<dd><p>
9741                    <code class="computeroutput"><span class="keyword">void</span></code>.
9742                  </p></dd>
9743<dt><span class="term">Throws:</span></dt>
9744<dd><p>
9745                    sync_queue_is_closed if the thread pool is closed. Whatever exception
9746                    that can be throw while storing the closure.
9747                  </p></dd>
9748<dt><span class="term">Exception safety:</span></dt>
9749<dd><p>
9750                    If an exception is thrown then the executor state is unmodified.
9751                  </p></dd>
9752</dl>
9753</div>
9754</div>
9755<div class="section">
9756<div class="titlepage"><div><div><h6 class="title">
9757<a name="thread.synchronization.executors.ref.concept_executor.close"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.close" title="e.close();"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span></code></a>
9758</h6></div></div></div>
9759<div class="variablelist">
9760<p class="title"><b></b></p>
9761<dl class="variablelist">
9762<dt><span class="term">Effects:</span></dt>
9763<dd><p>
9764                    close the executor <code class="computeroutput"><span class="identifier">e</span></code>
9765                    for submissions.
9766                  </p></dd>
9767<dt><span class="term">Remark:</span></dt>
9768<dd><p>
9769                    The worker threads will work until there is no more closures
9770                    to run.
9771                  </p></dd>
9772<dt><span class="term">Return type:</span></dt>
9773<dd><p>
9774                    <code class="computeroutput"><span class="keyword">void</span></code>.
9775                  </p></dd>
9776<dt><span class="term">Throws:</span></dt>
9777<dd><p>
9778                    Whatever exception that can be thrown while ensuring the thread
9779                    safety.
9780                  </p></dd>
9781<dt><span class="term">Exception safety:</span></dt>
9782<dd><p>
9783                    If an exception is thrown then the executor state is unmodified.
9784                  </p></dd>
9785</dl>
9786</div>
9787</div>
9788<div class="section">
9789<div class="titlepage"><div><div><h6 class="title">
9790<a name="thread.synchronization.executors.ref.concept_executor.closed"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.closed" title="b = e.closed();"><code class="computeroutput"><span class="identifier">b</span> <span class="special">=</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">closed</span><span class="special">();</span></code></a>
9791</h6></div></div></div>
9792<div class="variablelist">
9793<p class="title"><b></b></p>
9794<dl class="variablelist">
9795<dt><span class="term">Return type:</span></dt>
9796<dd><p>
9797                    <code class="computeroutput"><span class="keyword">bool</span></code>.
9798                  </p></dd>
9799<dt><span class="term">Return:</span></dt>
9800<dd><p>
9801                    whether the executor is closed for submissions.
9802                  </p></dd>
9803<dt><span class="term">Throws:</span></dt>
9804<dd><p>
9805                    Whatever exception that can be throw while ensuring the thread
9806                    safety.
9807                  </p></dd>
9808</dl>
9809</div>
9810</div>
9811<div class="section">
9812<div class="titlepage"><div><div><h6 class="title">
9813<a name="thread.synchronization.executors.ref.concept_executor.try_executing_one"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.try_executing_one" title="e.try_executing_one();"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">try_executing_one</span><span class="special">();</span></code></a>
9814</h6></div></div></div>
9815<div class="variablelist">
9816<p class="title"><b></b></p>
9817<dl class="variablelist">
9818<dt><span class="term">Effects:</span></dt>
9819<dd><p>
9820                    try to execute one work.
9821                  </p></dd>
9822<dt><span class="term">Remark:</span></dt>
9823<dd><p>
9824                    whether a work has been executed.
9825                  </p></dd>
9826<dt><span class="term">Return type:</span></dt>
9827<dd><p>
9828                    <code class="computeroutput"><span class="keyword">bool</span></code>.
9829                  </p></dd>
9830<dt><span class="term">Return:</span></dt>
9831<dd><p>
9832                    Whether a work has been executed.
9833                  </p></dd>
9834<dt><span class="term">Throws:</span></dt>
9835<dd><p>
9836                    whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
9837                    throws.
9838                  </p></dd>
9839</dl>
9840</div>
9841</div>
9842<div class="section">
9843<div class="titlepage"><div><div><h6 class="title">
9844<a name="thread.synchronization.executors.ref.concept_executor.reschedule_until"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.concept_executor.reschedule_until" title="e.reschedule_until(p);"><code class="computeroutput"><span class="identifier">e</span><span class="special">.</span><span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">p</span><span class="special">);</span></code></a>
9845</h6></div></div></div>
9846<div class="variablelist">
9847<p class="title"><b></b></p>
9848<dl class="variablelist">
9849<dt><span class="term">Requires:</span></dt>
9850<dd><p>
9851                    This must be called from a scheduled work
9852                  </p></dd>
9853<dt><span class="term">Effects:</span></dt>
9854<dd><p>
9855                    reschedule works until <code class="computeroutput"><span class="identifier">p</span><span class="special">()</span></code>.
9856                  </p></dd>
9857<dt><span class="term">Return type:</span></dt>
9858<dd><p>
9859                    <code class="computeroutput"><span class="keyword">bool</span></code>.
9860                  </p></dd>
9861<dt><span class="term">Return:</span></dt>
9862<dd><p>
9863                    Whether a work has been executed.
9864                  </p></dd>
9865<dt><span class="term">Throws:</span></dt>
9866<dd><p>
9867                    whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
9868                    throws.
9869                  </p></dd>
9870</dl>
9871</div>
9872</div>
9873</div>
9874<div class="section">
9875<div class="titlepage"><div><div><h5 class="title">
9876<a name="thread.synchronization.executors.ref.work"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.work" title="Class work">Class
9877          <code class="computeroutput"><span class="identifier">work</span></code></a>
9878</h5></div></div></div>
9879<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">work</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
9880<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9881  <span class="keyword">typedef</span> <span class="char">'implementation_defined'</span> <span class="identifier">work</span><span class="special">;</span>
9882<span class="special">}</span>
9883</pre>
9884<div class="variablelist">
9885<p class="title"><b></b></p>
9886<dl class="variablelist">
9887<dt><span class="term">Requires:</span></dt>
9888<dd><p>
9889                  work is a model of 'Closure'
9890                </p></dd>
9891</dl>
9892</div>
9893</div>
9894<div class="section">
9895<div class="titlepage"><div><div><h5 class="title">
9896<a name="thread.synchronization.executors.ref.executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor" title="Class executor">Class
9897          <code class="computeroutput"><span class="identifier">executor</span></code></a>
9898</h5></div></div></div>
9899<p>
9900            Executor abstract base class.
9901          </p>
9902<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
9903<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9904  <span class="keyword">class</span> <span class="identifier">executor</span>
9905  <span class="special">{</span>
9906  <span class="keyword">public</span><span class="special">:</span>
9907    <span class="keyword">typedef</span>  <span class="identifier">boost</span><span class="special">::</span><span class="identifier">work</span> <span class="identifier">work</span><span class="special">;</span>
9908
9909    <span class="identifier">executor</span><span class="special">(</span><span class="identifier">executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9910    <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>
9911
9912    <span class="identifier">executor</span><span class="special">();</span>
9913    <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor</span><span class="special">()</span> <span class="special">{};</span>
9914
9915    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9916    <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9917
9918    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&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>
9919    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&amp;</span> <span class="identifier">closure</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9920    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
9921    <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>
9922
9923    <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
9924    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
9925    <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
9926  <span class="special">};</span>
9927<span class="special">}</span>
9928</pre>
9929<div class="section">
9930<div class="titlepage"><div><div><h6 class="title">
9931<a name="thread.synchronization.executors.ref.executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor.constructor" title="Constructor executor()">Constructor
9932            <code class="computeroutput"><span class="identifier">executor</span><span class="special">()</span></code></a>
9933</h6></div></div></div>
9934<pre class="programlisting"><span class="identifier">executor</span><span class="special">();</span>
9935</pre>
9936<div class="variablelist">
9937<p class="title"><b></b></p>
9938<dl class="variablelist">
9939<dt><span class="term">Effects:</span></dt>
9940<dd><p>
9941                    Constructs an executor.
9942                  </p></dd>
9943<dt><span class="term">Throws:</span></dt>
9944<dd><p>
9945                    Nothing.
9946                  </p></dd>
9947</dl>
9948</div>
9949</div>
9950<div class="section">
9951<div class="titlepage"><div><div><h6 class="title">
9952<a name="thread.synchronization.executors.ref.executor.constructor0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor.constructor0" title="Destructor ~executor()">Destructor
9953            <code class="computeroutput"><span class="special">~</span><span class="identifier">executor</span><span class="special">()</span></code></a>
9954</h6></div></div></div>
9955<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor</span><span class="special">();</span>
9956</pre>
9957<div class="variablelist">
9958<p class="title"><b></b></p>
9959<dl class="variablelist">
9960<dt><span class="term">Effects:</span></dt>
9961<dd><p>
9962                    Destroys the executor.
9963                  </p></dd>
9964<dt><span class="term">Synchronization:</span></dt>
9965<dd><p>
9966                    The completion of all the closures happen before the completion
9967                    of the executor destructor.
9968                  </p></dd>
9969</dl>
9970</div>
9971</div>
9972</div>
9973<div class="section">
9974<div class="titlepage"><div><div><h5 class="title">
9975<a name="thread.synchronization.executors.ref.executor_adaptor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor" title="Template Class executor_adaptor">Template
9976          Class <code class="computeroutput"><span class="identifier">executor_adaptor</span></code></a>
9977</h5></div></div></div>
9978<p>
9979            Polymorphic adaptor of a model of Executor to an executor.
9980          </p>
9981<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
9982<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
9983  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
9984  <span class="keyword">class</span> <span class="identifier">executor_adaptor</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">executor</span>
9985  <span class="special">{</span>
9986    <span class="identifier">Executor</span> <span class="identifier">ex</span><span class="special">;</span> <span class="comment">// for exposition only</span>
9987  <span class="keyword">public</span><span class="special">:</span>
9988    <span class="keyword">typedef</span>  <span class="identifier">executor</span><span class="special">::</span><span class="identifier">work</span> <span class="identifier">work</span><span class="special">;</span>
9989
9990    <span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">executor_adaptor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
9991    <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>
9992
9993    <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>
9994    <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>
9995
9996    <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
9997
9998    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
9999    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10000
10001    <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&amp;&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
10002    <span class="keyword">void</span> <span class="identifier">submit</span><span class="special">(</span><span class="identifier">work</span><span class="special">&amp;</span> <span class="identifier">closure</span><span class="special">);</span>
10003
10004    <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10005
10006  <span class="special">};</span>
10007<span class="special">}</span>
10008</pre>
10009<div class="section">
10010<div class="titlepage"><div><div><h6 class="title">
10011<a name="thread.synchronization.executors.ref.executor_adaptor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.constructor" title="Constructor executor_adaptor(Args&amp;&amp; ...)">Constructor
10012            <code class="computeroutput"><span class="identifier">executor_adaptor</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&amp;&amp;</span>
10013            <span class="special">...)</span></code></a>
10014</h6></div></div></div>
10015<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="special">...</span><span class="identifier">Args</span><span class="special">&gt;</span>
10016<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>
10017</pre>
10018<div class="variablelist">
10019<p class="title"><b></b></p>
10020<dl class="variablelist">
10021<dt><span class="term">Effects:</span></dt>
10022<dd><p>
10023                    Constructs an executor_adaptor.
10024                  </p></dd>
10025<dt><span class="term">Throws:</span></dt>
10026<dd><p>
10027                    Nothing.
10028                  </p></dd>
10029</dl>
10030</div>
10031</div>
10032<div class="section">
10033<div class="titlepage"><div><div><h6 class="title">
10034<a name="thread.synchronization.executors.ref.executor_adaptor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.destructor" title="Destructor ~executor_adaptor()">Destructor
10035            <code class="computeroutput"><span class="special">~</span><span class="identifier">executor_adaptor</span><span class="special">()</span></code></a>
10036</h6></div></div></div>
10037<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">executor_adaptor</span><span class="special">();</span>
10038</pre>
10039<div class="variablelist">
10040<p class="title"><b></b></p>
10041<dl class="variablelist">
10042<dt><span class="term">Effects:</span></dt>
10043<dd><p>
10044                    Destroys the executor_adaptor.
10045                  </p></dd>
10046<dt><span class="term">Synchronization:</span></dt>
10047<dd><p>
10048                    The completion of all the closures happen before the completion
10049                    of the executor destructor.
10050                  </p></dd>
10051</dl>
10052</div>
10053</div>
10054<div class="section">
10055<div class="titlepage"><div><div><h6 class="title">
10056<a name="thread.synchronization.executors.ref.executor_adaptor.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.executor_adaptor.underlying_executor" title="Function member underlying_executor()">Function
10057            member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a>
10058</h6></div></div></div>
10059<pre class="programlisting"><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
10060</pre>
10061<div class="variablelist">
10062<p class="title"><b></b></p>
10063<dl class="variablelist">
10064<dt><span class="term">Return:</span></dt>
10065<dd><p>
10066                    The underlying executor instance.
10067                  </p></dd>
10068</dl>
10069</div>
10070</div>
10071</div>
10072<div class="section">
10073<div class="titlepage"><div><div><h5 class="title">
10074<a name="thread.synchronization.executors.ref.generic_executor_ref"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.generic_executor_ref" title="Class generic_executor_ref">Class
10075          <code class="computeroutput"><span class="identifier">generic_executor_ref</span></code></a>
10076</h5></div></div></div>
10077<p>
10078            Executor abstract base class.
10079          </p>
10080<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">generic_executor_ref</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10081<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10082  <span class="keyword">class</span> <span class="identifier">generic_executor_ref</span>
10083  <span class="special">{</span>
10084  <span class="keyword">public</span><span class="special">:</span>
10085    <span class="identifier">generic_executor_ref</span><span class="special">(</span><span class="identifier">generic_executor_ref</span> <span class="keyword">const</span><span class="special">&amp;);</span>
10086    <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>
10087
10088    <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>
10089    <span class="identifier">generic_executor_ref</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
10090    <span class="identifier">generic_executor_ref</span><span class="special">()</span> <span class="special">{};</span>
10091
10092    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
10093    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
10094
10095    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10096    <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>
10097
10098    <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
10099    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
10100    <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
10101  <span class="special">};</span>
10102<span class="special">}</span>
10103</pre>
10104</div>
10105<div class="section">
10106<div class="titlepage"><div><div><h5 class="title">
10107<a name="thread.synchronization.executors.ref.scheduler"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler" title="Template Class scheduler">Template
10108          Class <code class="computeroutput"><span class="identifier">scheduler</span> </code></a>
10109</h5></div></div></div>
10110<p>
10111            Scheduler providing time related functions. Note that <code class="computeroutput"><span class="identifier">scheduler</span></code>
10112            is not an Executor.
10113          </p>
10114<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">scheduler</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10115<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10116
10117  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Clock</span><span class="special">=</span><span class="identifier">steady_clock</span><span class="special">&gt;</span>
10118  <span class="keyword">class</span> <span class="identifier">scheduler</span>
10119  <span class="special">{</span>
10120  <span class="keyword">public</span><span class="special">:</span>
10121    <span class="keyword">using</span> <span class="identifier">work</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">()&gt;</span> <span class="special">;</span>
10122    <span class="keyword">using</span> <span class="identifier">clock</span> <span class="special">=</span> <span class="identifier">Clock</span><span class="special">;</span>
10123
10124    <span class="identifier">scheduler</span><span class="special">(</span><span class="identifier">scheduler</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10125    <span class="identifier">scheduler</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">scheduler</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10126
10127    <span class="identifier">scheduler</span><span class="special">();</span>
10128    <span class="special">~</span><span class="identifier">scheduler</span><span class="special">();</span>
10129
10130    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10131    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10132
10133    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10134    <span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</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>
10135    <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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10136    <span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</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>
10137
10138    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
10139    <span class="identifier">at_executor</span><span class="special">&lt;</span><span class="identifier">scheduler</span><span class="special">&gt;</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</span><span class="special">);</span>
10140    <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>
10141    <span class="identifier">at_executor</span><span class="special">&lt;</span><span class="identifier">scheduler</span><span class="special">&gt;</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</span><span class="special">);</span>
10142
10143    <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>
10144    <span class="identifier">scheduler_executor_wrapper</span><span class="special">&lt;</span><span class="identifier">scheduler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">on</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
10145
10146  <span class="special">};</span>
10147<span class="special">}</span>
10148</pre>
10149<div class="section">
10150<div class="titlepage"><div><div><h6 class="title">
10151<a name="thread.synchronization.executors.ref.scheduler.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler.constructor" title="Constructor scheduler()">Constructor
10152            <code class="computeroutput"><span class="identifier">scheduler</span><span class="special">()</span></code></a>
10153</h6></div></div></div>
10154<pre class="programlisting"><span class="identifier">scheduler</span><span class="special">();</span>
10155</pre>
10156<div class="variablelist">
10157<p class="title"><b></b></p>
10158<dl class="variablelist">
10159<dt><span class="term">Effects:</span></dt>
10160<dd><p>
10161                    Constructs a <code class="computeroutput"><span class="identifier">scheduler</span></code>.
10162                  </p></dd>
10163<dt><span class="term">Throws:</span></dt>
10164<dd><p>
10165                    Nothing.
10166                  </p></dd>
10167</dl>
10168</div>
10169</div>
10170<div class="section">
10171<div class="titlepage"><div><div><h6 class="title">
10172<a name="thread.synchronization.executors.ref.scheduler.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler.destructor" title="Destructor ~scheduler()">Destructor
10173            <code class="computeroutput"><span class="special">~</span><span class="identifier">scheduler</span><span class="special">()</span></code></a>
10174</h6></div></div></div>
10175<pre class="programlisting"><span class="special">~</span><span class="identifier">scheduler</span><span class="special">();</span>
10176</pre>
10177<div class="variablelist">
10178<p class="title"><b></b></p>
10179<dl class="variablelist">
10180<dt><span class="term">Effects:</span></dt>
10181<dd><p>
10182                    Destroys the scheduler.
10183                  </p></dd>
10184<dt><span class="term">Synchronization:</span></dt>
10185<dd><p>
10186                    The completion of all the closures happen before the completion
10187                    of the executor destructor.
10188                  </p></dd>
10189</dl>
10190</div>
10191</div>
10192<div class="section">
10193<div class="titlepage"><div><div><h6 class="title">
10194<a name="thread.synchronization.executors.ref.scheduler.submit_at"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler.submit_at" title="Template Function Member submit_at()">Template
10195            Function Member <code class="computeroutput"><span class="identifier">submit_at</span><span class="special">()</span></code></a>
10196</h6></div></div></div>
10197<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10198<span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</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>
10199</pre>
10200<div class="variablelist">
10201<p class="title"><b></b></p>
10202<dl class="variablelist">
10203<dt><span class="term">Effects:</span></dt>
10204<dd><p>
10205                    Schedule a <code class="computeroutput"><span class="identifier">closure</span></code>
10206                    to be executed at <code class="computeroutput"><span class="identifier">abs_time</span></code>.
10207                  </p></dd>
10208<dt><span class="term">Throws:</span></dt>
10209<dd><p>
10210                    Nothing.
10211                  </p></dd>
10212</dl>
10213</div>
10214</div>
10215<div class="section">
10216<div class="titlepage"><div><div><h6 class="title">
10217<a name="thread.synchronization.executors.ref.scheduler.submit_after"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler.submit_after" title="Template Function Member submit_after()">Template
10218            Function Member <code class="computeroutput"><span class="identifier">submit_after</span><span class="special">()</span></code></a>
10219</h6></div></div></div>
10220<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10221<span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</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>
10222</pre>
10223<div class="variablelist">
10224<p class="title"><b></b></p>
10225<dl class="variablelist">
10226<dt><span class="term">Effects:</span></dt>
10227<dd><p>
10228                    Schedule a <code class="computeroutput"><span class="identifier">closure</span></code>
10229                    to be executed after <code class="computeroutput"><span class="identifier">rel_time</span></code>.
10230                  </p></dd>
10231<dt><span class="term">Throws:</span></dt>
10232<dd><p>
10233                    Nothing.
10234                  </p></dd>
10235</dl>
10236</div>
10237</div>
10238</div>
10239<div class="section">
10240<div class="titlepage"><div><div><h5 class="title">
10241<a name="thread.synchronization.executors.ref.at_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor" title="Template Class at_executor">Template
10242          Class <code class="computeroutput"><span class="identifier">at_executor</span></code></a>
10243</h5></div></div></div>
10244<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">scheduler</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10245<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10246
10247  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Scheduler</span><span class="special">&gt;</span>
10248  <span class="keyword">class</span> <span class="identifier">at_executor</span>
10249  <span class="special">{</span>
10250  <span class="keyword">public</span><span class="special">:</span>
10251    <span class="keyword">using</span> <span class="identifier">work</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">work</span><span class="special">;</span>
10252    <span class="keyword">using</span> <span class="identifier">clock</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">clock</span><span class="special">;</span>
10253
10254    <span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">at_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10255    <span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">at_executor</span> <span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10256    <span class="identifier">at_executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">at_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10257    <span class="identifier">at_executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">at_executor</span> <span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10258
10259    <span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">tp</span><span class="special">);</span>
10260    <span class="special">~</span><span class="identifier">at_executor</span><span class="special">();</span>
10261
10262    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10263    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10264
10265    <span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">underlying_scheduler</span><span class="special">();</span>
10266
10267    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10268    <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>
10269    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Work</span><span class="special">&gt;</span>
10270    <span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</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>
10271    <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">typename</span> <span class="identifier">Work</span><span class="special">&gt;</span>
10272    <span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</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>
10273
10274    <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>
10275    <span class="identifier">resubmit_at_executor</span><span class="special">&lt;</span><span class="identifier">Scheduler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">on</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
10276
10277  <span class="special">};</span>
10278<span class="special">}</span>
10279</pre>
10280<div class="section">
10281<div class="titlepage"><div><div><h6 class="title">
10282<a name="thread.synchronization.executors.ref.at_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.constructor" title="Constructor at_executor(Scheduler&amp;, clock::time_point const&amp;)">Constructor
10283            <code class="computeroutput"><span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;,</span>
10284            <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span></code></a>
10285</h6></div></div></div>
10286<pre class="programlisting"><span class="identifier">at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">tp</span><span class="special">);</span>
10287</pre>
10288<div class="variablelist">
10289<p class="title"><b></b></p>
10290<dl class="variablelist">
10291<dt><span class="term">Effects:</span></dt>
10292<dd><p>
10293                    Constructs a <code class="computeroutput"><span class="identifier">at_executor</span></code>.
10294                  </p></dd>
10295<dt><span class="term">Throws:</span></dt>
10296<dd><p>
10297                    Nothing.
10298                  </p></dd>
10299</dl>
10300</div>
10301</div>
10302<div class="section">
10303<div class="titlepage"><div><div><h6 class="title">
10304<a name="thread.synchronization.executors.ref.at_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.destructor" title="Destructor ~at_executor()">Destructor
10305            <code class="computeroutput"><span class="special">~</span><span class="identifier">at_executor</span><span class="special">()</span></code></a>
10306</h6></div></div></div>
10307<pre class="programlisting"><span class="special">~</span><span class="identifier">at_executor</span><span class="special">();</span>
10308</pre>
10309<div class="variablelist">
10310<p class="title"><b></b></p>
10311<dl class="variablelist">
10312<dt><span class="term">Effects:</span></dt>
10313<dd><p>
10314                    Destroys the <code class="computeroutput"><span class="identifier">at_executor</span></code>.
10315                  </p></dd>
10316<dt><span class="term">Synchronization:</span></dt>
10317<dd><p>
10318                    The completion of all the closures happen before the completion
10319                    of the executor destructor.
10320                  </p></dd>
10321</dl>
10322</div>
10323</div>
10324<div class="section">
10325<div class="titlepage"><div><div><h6 class="title">
10326<a name="thread.synchronization.executors.ref.at_executor.underlying_scheduler"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.underlying_scheduler" title="Function member underlying_scheduler()">Function
10327            member <code class="computeroutput"><span class="identifier">underlying_scheduler</span><span class="special">()</span></code></a>
10328</h6></div></div></div>
10329<pre class="programlisting"><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">underlying_scheduler</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
10330</pre>
10331<div class="variablelist">
10332<p class="title"><b></b></p>
10333<dl class="variablelist">
10334<dt><span class="term">Return:</span></dt>
10335<dd><p>
10336                    The underlying scheduler instance.
10337                  </p></dd>
10338</dl>
10339</div>
10340</div>
10341<div class="section">
10342<div class="titlepage"><div><div><h6 class="title">
10343<a name="thread.synchronization.executors.ref.at_executor.submit_at"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.submit_at" title="Template Function Member submit()">Template
10344            Function Member <code class="computeroutput"><span class="identifier">submit</span><span class="special">()</span></code></a>
10345</h6></div></div></div>
10346<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10347<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>
10348</pre>
10349<div class="variablelist">
10350<p class="title"><b></b></p>
10351<dl class="variablelist">
10352<dt><span class="term">Effects:</span></dt>
10353<dd><p>
10354                    Schedule the <code class="computeroutput"><span class="identifier">closure</span></code>
10355                    to be executed at the <code class="computeroutput"><span class="identifier">abs_time</span></code>
10356                    given at construction time.
10357                  </p></dd>
10358<dt><span class="term">Throws:</span></dt>
10359<dd><p>
10360                    Nothing.
10361                  </p></dd>
10362</dl>
10363</div>
10364</div>
10365<div class="section">
10366<div class="titlepage"><div><div><h6 class="title">
10367<a name="thread.synchronization.executors.ref.at_executor.submit_at0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.submit_at0" title="Template Function Member submit_at()">Template
10368            Function Member <code class="computeroutput"><span class="identifier">submit_at</span><span class="special">()</span></code></a>
10369</h6></div></div></div>
10370<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10371<span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</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>
10372</pre>
10373<div class="variablelist">
10374<p class="title"><b></b></p>
10375<dl class="variablelist">
10376<dt><span class="term">Effects:</span></dt>
10377<dd><p>
10378                    Schedule a <code class="computeroutput"><span class="identifier">closure</span></code>
10379                    to be executed at <code class="computeroutput"><span class="identifier">abs_time</span></code>.
10380                  </p></dd>
10381<dt><span class="term">Throws:</span></dt>
10382<dd><p>
10383                    Nothing.
10384                  </p></dd>
10385</dl>
10386</div>
10387</div>
10388<div class="section">
10389<div class="titlepage"><div><div><h6 class="title">
10390<a name="thread.synchronization.executors.ref.at_executor.submit_after"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.at_executor.submit_after" title="Template Function Member submit_after()">Template
10391            Function Member <code class="computeroutput"><span class="identifier">submit_after</span><span class="special">()</span></code></a>
10392</h6></div></div></div>
10393<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10394<span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</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>
10395</pre>
10396<div class="variablelist">
10397<p class="title"><b></b></p>
10398<dl class="variablelist">
10399<dt><span class="term">Effects:</span></dt>
10400<dd><p>
10401                    Schedule a <code class="computeroutput"><span class="identifier">closure</span></code>
10402                    to be executed after <code class="computeroutput"><span class="identifier">rel_time</span></code>.
10403                  </p></dd>
10404<dt><span class="term">Throws:</span></dt>
10405<dd><p>
10406                    Nothing.
10407                  </p></dd>
10408</dl>
10409</div>
10410</div>
10411</div>
10412<div class="section">
10413<div class="titlepage"><div><div><h5 class="title">
10414<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper" title="Template Class scheduler_executor_wrapper">Template
10415          Class <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span></code></a>
10416</h5></div></div></div>
10417<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">scheduler</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10418<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10419
10420  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Scheduler</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
10421  <span class="keyword">class</span> <span class="identifier">scheduler_executor_wrapper</span>
10422  <span class="special">{</span>
10423  <span class="keyword">public</span><span class="special">:</span>
10424    <span class="keyword">using</span> <span class="identifier">work</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">work</span><span class="special">;</span>
10425    <span class="keyword">using</span> <span class="identifier">clock</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">clock</span><span class="special">;</span>
10426
10427    <span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">scheduler_executor_wrapper</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10428    <span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">scheduler_executor_wrapper</span> <span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10429    <span class="identifier">scheduler_executor_wrapper</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">scheduler_executor_wrapper</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10430    <span class="identifier">scheduler_executor_wrapper</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">scheduler_executor_wrapper</span> <span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10431
10432    <span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
10433
10434    <span class="special">~</span><span class="identifier">scheduler_executor_wrapper</span><span class="special">();</span>
10435
10436    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10437    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10438
10439    <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
10440    <span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">underlying_scheduler</span><span class="special">();</span>
10441
10442    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10443    <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>
10444    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Work</span><span class="special">&gt;</span>
10445    <span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</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>
10446    <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">typename</span> <span class="identifier">Work</span><span class="special">&gt;</span>
10447    <span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</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>
10448
10449    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
10450    <span class="identifier">resubmit_at_executor</span><span class="special">&lt;</span><span class="identifier">Scheduler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</span><span class="special">);</span>
10451    <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>
10452    <span class="identifier">resubmit_at_executor</span><span class="special">&lt;</span><span class="identifier">Scheduler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span> <span class="identifier">after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</span><span class="special">);</span>
10453
10454  <span class="special">};</span>
10455<span class="special">}</span>
10456</pre>
10457<div class="section">
10458<div class="titlepage"><div><div><h6 class="title">
10459<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.constructor" title="Constructor scheduler_executor_wrapper(Scheduler&amp;, Executor&amp;)">Constructor
10460            <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;,</span> <span class="identifier">Executor</span><span class="special">&amp;)</span></code></a>
10461</h6></div></div></div>
10462<pre class="programlisting"><span class="identifier">scheduler_executor_wrapper</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">sch</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
10463</pre>
10464<div class="variablelist">
10465<p class="title"><b></b></p>
10466<dl class="variablelist">
10467<dt><span class="term">Effects:</span></dt>
10468<dd><p>
10469                    Constructs a <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span></code>.
10470                  </p></dd>
10471<dt><span class="term">Throws:</span></dt>
10472<dd><p>
10473                    Nothing.
10474                  </p></dd>
10475</dl>
10476</div>
10477</div>
10478<div class="section">
10479<div class="titlepage"><div><div><h6 class="title">
10480<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.destructor" title="Destructor ~scheduler_executor_wrapper()">Destructor
10481            <code class="computeroutput"><span class="special">~</span><span class="identifier">scheduler_executor_wrapper</span><span class="special">()</span></code></a>
10482</h6></div></div></div>
10483<pre class="programlisting"><span class="special">~</span><span class="identifier">scheduler_executor_wrapper</span><span class="special">();</span>
10484</pre>
10485<div class="variablelist">
10486<p class="title"><b></b></p>
10487<dl class="variablelist">
10488<dt><span class="term">Effects:</span></dt>
10489<dd><p>
10490                    Destroys the <code class="computeroutput"><span class="identifier">scheduler_executor_wrapper</span></code>.
10491                  </p></dd>
10492<dt><span class="term">Synchronization:</span></dt>
10493<dd><p>
10494                    The completion of all the closures happen before the completion
10495                    of the executor destructor.
10496                  </p></dd>
10497</dl>
10498</div>
10499</div>
10500<div class="section">
10501<div class="titlepage"><div><div><h6 class="title">
10502<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.underlying_scheduler"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.underlying_scheduler" title="Function member underlying_scheduler()">Function
10503            member <code class="computeroutput"><span class="identifier">underlying_scheduler</span><span class="special">()</span></code></a>
10504</h6></div></div></div>
10505<pre class="programlisting"><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">underlying_scheduler</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
10506</pre>
10507<div class="variablelist">
10508<p class="title"><b></b></p>
10509<dl class="variablelist">
10510<dt><span class="term">Return:</span></dt>
10511<dd><p>
10512                    The underlying scheduler instance.
10513                  </p></dd>
10514</dl>
10515</div>
10516</div>
10517<div class="section">
10518<div class="titlepage"><div><div><h6 class="title">
10519<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.underlying_executor" title="Function member underlying_executor()">Function
10520            member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a>
10521</h6></div></div></div>
10522<pre class="programlisting"><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
10523</pre>
10524<div class="variablelist">
10525<p class="title"><b></b></p>
10526<dl class="variablelist">
10527<dt><span class="term">Return:</span></dt>
10528<dd><p>
10529                    The underlying executor instance.
10530                  </p></dd>
10531</dl>
10532</div>
10533</div>
10534<div class="section">
10535<div class="titlepage"><div><div><h6 class="title">
10536<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_at"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_at" title="Template Function Member submit()">Template
10537            Function Member <code class="computeroutput"><span class="identifier">submit</span><span class="special">()</span></code></a>
10538</h6></div></div></div>
10539<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10540<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>
10541</pre>
10542<div class="variablelist">
10543<p class="title"><b></b></p>
10544<dl class="variablelist">
10545<dt><span class="term">Effects:</span></dt>
10546<dd><p>
10547                    Submit the <code class="computeroutput"><span class="identifier">closure</span></code>
10548                    on the underlying executor.
10549                  </p></dd>
10550<dt><span class="term">Throws:</span></dt>
10551<dd><p>
10552                    Nothing.
10553                  </p></dd>
10554</dl>
10555</div>
10556</div>
10557<div class="section">
10558<div class="titlepage"><div><div><h6 class="title">
10559<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_at0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_at0" title="Template Function Member submit_at()">Template
10560            Function Member <code class="computeroutput"><span class="identifier">submit_at</span><span class="special">()</span></code></a>
10561</h6></div></div></div>
10562<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10563<span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</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>
10564</pre>
10565<div class="variablelist">
10566<p class="title"><b></b></p>
10567<dl class="variablelist">
10568<dt><span class="term">Effects:</span></dt>
10569<dd><p>
10570                    Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code>
10571                    to be executed on the underlying executor at <code class="computeroutput"><span class="identifier">abs_time</span></code>.
10572                  </p></dd>
10573<dt><span class="term">Throws:</span></dt>
10574<dd><p>
10575                    Nothing.
10576                  </p></dd>
10577</dl>
10578</div>
10579</div>
10580<div class="section">
10581<div class="titlepage"><div><div><h6 class="title">
10582<a name="thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_after"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.scheduler_executor_wrapper.submit_after" title="Template Function Member submit_after()">Template
10583            Function Member <code class="computeroutput"><span class="identifier">submit_after</span><span class="special">()</span></code></a>
10584</h6></div></div></div>
10585<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10586<span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</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>
10587</pre>
10588<div class="variablelist">
10589<p class="title"><b></b></p>
10590<dl class="variablelist">
10591<dt><span class="term">Effects:</span></dt>
10592<dd><p>
10593                    Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code>
10594                    to be executed on the underlying executor after <code class="computeroutput"><span class="identifier">rel_time</span></code>.
10595                  </p></dd>
10596<dt><span class="term">Throws:</span></dt>
10597<dd><p>
10598                    Nothing.
10599                  </p></dd>
10600</dl>
10601</div>
10602</div>
10603</div>
10604<div class="section">
10605<div class="titlepage"><div><div><h5 class="title">
10606<a name="thread.synchronization.executors.ref.resubmit_at_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor" title="Template Class resubmit_at_executor">Template
10607          Class <code class="computeroutput"><span class="identifier">resubmit_at_executor</span></code></a>
10608</h5></div></div></div>
10609<p>
10610            <code class="computeroutput"><span class="identifier">Executor</span></code> wrapping an
10611            <code class="computeroutput"><span class="identifier">Scheduler</span></code>, an <code class="computeroutput"><span class="identifier">Executor</span></code> and a <code class="computeroutput"><span class="identifier">time_point</span></code>
10612            providing an <code class="computeroutput"><span class="identifier">Executor</span></code>
10613            interface.
10614          </p>
10615<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">scheduler</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10616<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10617
10618  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Scheduler</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
10619  <span class="keyword">class</span> <span class="identifier">resubmit_at_executor</span>
10620  <span class="special">{</span>
10621  <span class="keyword">public</span><span class="special">:</span>
10622    <span class="keyword">using</span> <span class="identifier">work</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">work</span><span class="special">;</span>
10623    <span class="keyword">using</span> <span class="identifier">clock</span> <span class="special">=</span> <span class="identifier">Scheduler</span><span class="special">::</span><span class="identifier">clock</span><span class="special">;</span>
10624
10625    <span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">resubmit_at_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10626    <span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">resubmit_at_executor</span> <span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10627    <span class="identifier">resubmit_at_executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">resubmit_at_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10628    <span class="identifier">resubmit_at_executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">resubmit_at_executor</span> <span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
10629
10630    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
10631    <span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">sch</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">clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">tp</span><span class="special">);</span>
10632    <span class="special">~</span><span class="identifier">resubmit_at_executor</span><span class="special">();</span>
10633
10634    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10635    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10636
10637    <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">();</span>
10638    <span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">underlying_scheduler</span><span class="special">();</span>
10639
10640    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10641    <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>
10642    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Work</span><span class="special">&gt;</span>
10643    <span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</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>
10644    <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">typename</span> <span class="identifier">Work</span><span class="special">&gt;</span>
10645    <span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</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>
10646
10647  <span class="special">};</span>
10648<span class="special">}</span>
10649</pre>
10650<div class="section">
10651<div class="titlepage"><div><div><h6 class="title">
10652<a name="thread.synchronization.executors.ref.resubmit_at_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.constructor" title="Constructor resubmit_at_executor(Scheduler&amp;, Executor&amp;, clock::time_point&lt;Duration&gt;)">Constructor
10653            <code class="computeroutput"><span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;,</span> <span class="identifier">Executor</span><span class="special">&amp;,</span> <span class="identifier">clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Duration</span><span class="special">&gt;)</span></code></a>
10654</h6></div></div></div>
10655<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
10656<span class="identifier">resubmit_at_executor</span><span class="special">(</span><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">sch</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">clock</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">tp</span><span class="special">);</span>
10657</pre>
10658<div class="variablelist">
10659<p class="title"><b></b></p>
10660<dl class="variablelist">
10661<dt><span class="term">Effects:</span></dt>
10662<dd><p>
10663                    Constructs a <code class="computeroutput"><span class="identifier">resubmit_at_executor</span></code>.
10664                  </p></dd>
10665<dt><span class="term">Throws:</span></dt>
10666<dd><p>
10667                    Nothing.
10668                  </p></dd>
10669</dl>
10670</div>
10671</div>
10672<div class="section">
10673<div class="titlepage"><div><div><h6 class="title">
10674<a name="thread.synchronization.executors.ref.resubmit_at_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.destructor" title="Destructor ~resubmit_at_executor()">Destructor
10675            <code class="computeroutput"><span class="special">~</span><span class="identifier">resubmit_at_executor</span><span class="special">()</span></code></a>
10676</h6></div></div></div>
10677<pre class="programlisting"><span class="special">~</span><span class="identifier">resubmit_at_executor</span><span class="special">();</span>
10678</pre>
10679<div class="variablelist">
10680<p class="title"><b></b></p>
10681<dl class="variablelist">
10682<dt><span class="term">Effects:</span></dt>
10683<dd><p>
10684                    Destroys the executor_adaptor.
10685                  </p></dd>
10686<dt><span class="term">Synchronization:</span></dt>
10687<dd><p>
10688                    The completion of all the closures happen before the completion
10689                    of the executor destructor.
10690                  </p></dd>
10691</dl>
10692</div>
10693</div>
10694<div class="section">
10695<div class="titlepage"><div><div><h6 class="title">
10696<a name="thread.synchronization.executors.ref.resubmit_at_executor.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.underlying_executor" title="Function member underlying_executor()">Function
10697            member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a>
10698</h6></div></div></div>
10699<pre class="programlisting"><span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
10700</pre>
10701<div class="variablelist">
10702<p class="title"><b></b></p>
10703<dl class="variablelist">
10704<dt><span class="term">Return:</span></dt>
10705<dd><p>
10706                    The underlying executor instance.
10707                  </p></dd>
10708</dl>
10709</div>
10710</div>
10711<div class="section">
10712<div class="titlepage"><div><div><h6 class="title">
10713<a name="thread.synchronization.executors.ref.resubmit_at_executor.underlying_scheduler"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.underlying_scheduler" title="Function member underlying_scheduler()">Function
10714            member <code class="computeroutput"><span class="identifier">underlying_scheduler</span><span class="special">()</span></code></a>
10715</h6></div></div></div>
10716<pre class="programlisting"><span class="identifier">Scheduler</span><span class="special">&amp;</span> <span class="identifier">underlying_scheduler</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
10717</pre>
10718<div class="variablelist">
10719<p class="title"><b></b></p>
10720<dl class="variablelist">
10721<dt><span class="term">Return:</span></dt>
10722<dd><p>
10723                    The underlying scheduler instance.
10724                  </p></dd>
10725</dl>
10726</div>
10727</div>
10728<div class="section">
10729<div class="titlepage"><div><div><h6 class="title">
10730<a name="thread.synchronization.executors.ref.resubmit_at_executor.submit_at"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.submit_at" title="Template Function Member submit()">Template
10731            Function Member <code class="computeroutput"><span class="identifier">submit</span><span class="special">()</span></code></a>
10732</h6></div></div></div>
10733<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10734<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>
10735</pre>
10736<div class="variablelist">
10737<p class="title"><b></b></p>
10738<dl class="variablelist">
10739<dt><span class="term">Effects:</span></dt>
10740<dd><p>
10741                    Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code>
10742                    to be executed on the underlying executor at the <code class="computeroutput"><span class="identifier">abs_time</span></code> given at construction
10743                    time.
10744                  </p></dd>
10745<dt><span class="term">Throws:</span></dt>
10746<dd><p>
10747                    Nothing.
10748                  </p></dd>
10749</dl>
10750</div>
10751</div>
10752<div class="section">
10753<div class="titlepage"><div><div><h6 class="title">
10754<a name="thread.synchronization.executors.ref.resubmit_at_executor.submit_at0"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.submit_at0" title="Template Function Member submit_at()">Template
10755            Function Member <code class="computeroutput"><span class="identifier">submit_at</span><span class="special">()</span></code></a>
10756</h6></div></div></div>
10757<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10758<span class="keyword">void</span> <span class="identifier">submit_at</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span><span class="identifier">Clock</span><span class="special">,</span><span class="identifier">Duration</span><span class="special">&gt;</span> <span class="identifier">abs_time</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>
10759</pre>
10760<div class="variablelist">
10761<p class="title"><b></b></p>
10762<dl class="variablelist">
10763<dt><span class="term">Effects:</span></dt>
10764<dd><p>
10765                    Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code>
10766                    to be executed on the underlying executor at <code class="computeroutput"><span class="identifier">abs_time</span></code>.
10767                  </p></dd>
10768<dt><span class="term">Throws:</span></dt>
10769<dd><p>
10770                    Nothing.
10771                  </p></dd>
10772</dl>
10773</div>
10774</div>
10775<div class="section">
10776<div class="titlepage"><div><div><h6 class="title">
10777<a name="thread.synchronization.executors.ref.resubmit_at_executor.submit_after"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.resubmit_at_executor.submit_after" title="Template Function Member submit_after()">Template
10778            Function Member <code class="computeroutput"><span class="identifier">submit_after</span><span class="special">()</span></code></a>
10779</h6></div></div></div>
10780<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10781<span class="keyword">void</span> <span class="identifier">submit_after</span><span class="special">(</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span><span class="identifier">Rep</span><span class="special">,</span><span class="identifier">Period</span><span class="special">&gt;</span> <span class="identifier">rel_time</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>
10782</pre>
10783<div class="variablelist">
10784<p class="title"><b></b></p>
10785<dl class="variablelist">
10786<dt><span class="term">Effects:</span></dt>
10787<dd><p>
10788                    Resubmit the <code class="computeroutput"><span class="identifier">closure</span></code>
10789                    to be executed on the underlying executor after <code class="computeroutput"><span class="identifier">rel_time</span></code>.
10790                  </p></dd>
10791<dt><span class="term">Throws:</span></dt>
10792<dd><p>
10793                    Nothing.
10794                  </p></dd>
10795</dl>
10796</div>
10797</div>
10798</div>
10799<div class="section">
10800<div class="titlepage"><div><div><h5 class="title">
10801<a name="thread.synchronization.executors.ref.serial_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor" title="Template Class serial_executor">Template
10802          Class <code class="computeroutput"><span class="identifier">serial_executor</span></code></a>
10803</h5></div></div></div>
10804<p>
10805            A serial executor ensuring that there are no two work units that executes
10806            concurrently.
10807          </p>
10808<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">serial_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10809<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10810  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
10811  <span class="keyword">class</span> <span class="identifier">serial_executor</span>
10812  <span class="special">{</span>
10813  <span class="keyword">public</span><span class="special">:</span>
10814    <span class="identifier">serial_executor</span><span class="special">(</span><span class="identifier">serial_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10815    <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>
10816
10817    <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>
10818    <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>
10819
10820    <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
10821
10822    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10823    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10824
10825    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10826    <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>
10827
10828    <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10829    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
10830    <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
10831
10832  <span class="special">};</span>
10833<span class="special">}</span>
10834</pre>
10835<div class="section">
10836<div class="titlepage"><div><div><h6 class="title">
10837<a name="thread.synchronization.executors.ref.serial_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.constructor" title="Constructor serial_executor(Executor&amp;)">Constructor
10838            <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>
10839</h6></div></div></div>
10840<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>
10841<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>
10842</pre>
10843<div class="variablelist">
10844<p class="title"><b></b></p>
10845<dl class="variablelist">
10846<dt><span class="term">Effects:</span></dt>
10847<dd><p>
10848                    Constructs a serial_executor.
10849                  </p></dd>
10850<dt><span class="term">Throws:</span></dt>
10851<dd><p>
10852                    Nothing.
10853                  </p></dd>
10854</dl>
10855</div>
10856</div>
10857<div class="section">
10858<div class="titlepage"><div><div><h6 class="title">
10859<a name="thread.synchronization.executors.ref.serial_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.destructor" title="Destructor ~serial_executor()">Destructor
10860            <code class="computeroutput"><span class="special">~</span><span class="identifier">serial_executor</span><span class="special">()</span></code></a>
10861</h6></div></div></div>
10862<pre class="programlisting"><span class="special">~</span><span class="identifier">serial_executor</span><span class="special">();</span>
10863</pre>
10864<div class="variablelist">
10865<p class="title"><b></b></p>
10866<dl class="variablelist">
10867<dt><span class="term">Effects:</span></dt>
10868<dd><p>
10869                    Destroys the serial_executor.
10870                  </p></dd>
10871<dt><span class="term">Synchronization:</span></dt>
10872<dd><p>
10873                    The completion of all the closures happen before the completion
10874                    of the executor destructor.
10875                  </p></dd>
10876</dl>
10877</div>
10878</div>
10879<div class="section">
10880<div class="titlepage"><div><div><h6 class="title">
10881<a name="thread.synchronization.executors.ref.serial_executor.underlying_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.serial_executor.underlying_executor" title="Function member underlying_executor()">Function
10882            member <code class="computeroutput"><span class="identifier">underlying_executor</span><span class="special">()</span></code></a>
10883</h6></div></div></div>
10884<pre class="programlisting"><span class="identifier">generic_executor_ref</span><span class="special">&amp;</span> <span class="identifier">underlying_executor</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
10885</pre>
10886<div class="variablelist">
10887<p class="title"><b></b></p>
10888<dl class="variablelist">
10889<dt><span class="term">Return:</span></dt>
10890<dd><p>
10891                    The underlying executor instance.
10892                  </p></dd>
10893<dt><span class="term">Throws:</span></dt>
10894<dd><p>
10895                    Nothing.
10896                  </p></dd>
10897</dl>
10898</div>
10899</div>
10900</div>
10901<div class="section">
10902<div class="titlepage"><div><div><h5 class="title">
10903<a name="thread.synchronization.executors.ref.inline_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor" title="Class inline_executor">Class
10904          <code class="computeroutput"><span class="identifier">inline_executor</span></code></a>
10905</h5></div></div></div>
10906<p>
10907            A serial executor ensuring that there are no two work units that executes
10908            concurrently.
10909          </p>
10910<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">inline_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
10911<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10912  <span class="keyword">class</span> <span class="identifier">inline_executor</span>
10913  <span class="special">{</span>
10914  <span class="keyword">public</span><span class="special">:</span>
10915    <span class="identifier">inline_executor</span><span class="special">(</span><span class="identifier">inline_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10916    <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>
10917
10918    <span class="identifier">inline_executor</span><span class="special">();</span>
10919
10920    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
10921    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
10922
10923    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
10924    <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>
10925
10926    <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
10927    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
10928    <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
10929
10930  <span class="special">};</span>
10931<span class="special">}</span>
10932</pre>
10933<div class="section">
10934<div class="titlepage"><div><div><h6 class="title">
10935<a name="thread.synchronization.executors.ref.inline_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor.constructor" title="Constructor inline_executor()">Constructor
10936            <code class="computeroutput"><span class="identifier">inline_executor</span><span class="special">()</span></code></a>
10937</h6></div></div></div>
10938<pre class="programlisting"><span class="identifier">inline_executor</span><span class="special">();</span>
10939</pre>
10940<div class="variablelist">
10941<p class="title"><b></b></p>
10942<dl class="variablelist">
10943<dt><span class="term">Effects:</span></dt>
10944<dd><p>
10945                    Constructs an inline_executor.
10946                  </p></dd>
10947<dt><span class="term">Throws:</span></dt>
10948<dd><p>
10949                    Nothing.
10950                  </p></dd>
10951</dl>
10952</div>
10953</div>
10954<div class="section">
10955<div class="titlepage"><div><div><h6 class="title">
10956<a name="thread.synchronization.executors.ref.inline_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.inline_executor.destructor" title="Destructor ~inline_executor()">Destructor
10957            <code class="computeroutput"><span class="special">~</span><span class="identifier">inline_executor</span><span class="special">()</span></code></a>
10958</h6></div></div></div>
10959<pre class="programlisting"><span class="special">~</span><span class="identifier">inline_executor</span><span class="special">();</span>
10960</pre>
10961<div class="variablelist">
10962<p class="title"><b></b></p>
10963<dl class="variablelist">
10964<dt><span class="term">Effects:</span></dt>
10965<dd><p>
10966                    Destroys the inline_executor.
10967                  </p></dd>
10968<dt><span class="term">Synchronization:</span></dt>
10969<dd><p>
10970                    The completion of all the closures happen before the completion
10971                    of the executor destructor.
10972                  </p></dd>
10973</dl>
10974</div>
10975</div>
10976</div>
10977<div class="section">
10978<div class="titlepage"><div><div><h5 class="title">
10979<a name="thread.synchronization.executors.ref.basic_thread_pool"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool" title="Class basic_thread_pool">Class
10980          <code class="computeroutput"><span class="identifier">basic_thread_pool</span></code></a>
10981</h5></div></div></div>
10982<p>
10983            A thread pool with up to a fixed number of threads.
10984          </p>
10985<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
10986<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
10987  <span class="keyword">class</span> <span class="identifier">basic_thread_pool</span>
10988  <span class="special">{</span>
10989  <span class="keyword">public</span><span class="special">:</span>
10990
10991    <span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="identifier">basic_thread_pool</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
10992    <span class="identifier">basic_thread_pool</span><span class="special">&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>
10993
10994    <span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">thread_count</span> <span class="special">=</span> <span class="identifier">thread</span><span class="special">::</span><span class="identifier">hardware_concurrency</span><span class="special">());</span>
10995    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">AtThreadEntry</span><span class="special">&gt;</span>
10996    <span class="identifier">basic_thread_pool</span><span class="special">(</span> <span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">thread_count</span><span class="special">,</span> <span class="identifier">AtThreadEntry</span> <span class="identifier">at_thread_entry</span><span class="special">);</span>
10997    <span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">();</span>
10998
10999    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
11000    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
11001
11002    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
11003    <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>
11004
11005    <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
11006
11007    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
11008    <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
11009
11010  <span class="special">};</span>
11011<span class="special">}</span>
11012</pre>
11013<div class="section">
11014<div class="titlepage"><div><div><h6 class="title">
11015<a name="thread.synchronization.executors.ref.basic_thread_pool.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool.constructor" title="Constructor basic_thread_pool(unsigned const)">Constructor
11016            <code class="computeroutput"><span class="identifier">basic_thread_pool</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">const</span><span class="special">)</span></code></a>
11017</h6></div></div></div>
11018<div class="variablelist">
11019<p class="title"><b></b></p>
11020<dl class="variablelist">
11021<dt><span class="term">Effects:</span></dt>
11022<dd><p>
11023                    creates a thread pool that runs closures on <code class="computeroutput"><span class="identifier">thread_count</span></code>
11024                    threads.
11025                  </p></dd>
11026<dt><span class="term">Throws:</span></dt>
11027<dd><p>
11028                    Whatever exception is thrown while initializing the needed resources.
11029                  </p></dd>
11030</dl>
11031</div>
11032</div>
11033<div class="section">
11034<div class="titlepage"><div><div><h6 class="title">
11035<a name="thread.synchronization.executors.ref.basic_thread_pool.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.basic_thread_pool.destructor" title="Destructor ~basic_thread_pool()">Destructor
11036            <code class="computeroutput"><span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">()</span></code></a>
11037</h6></div></div></div>
11038<pre class="programlisting"><span class="special">~</span><span class="identifier">basic_thread_pool</span><span class="special">();</span>
11039</pre>
11040<div class="variablelist">
11041<p class="title"><b></b></p>
11042<dl class="variablelist">
11043<dt><span class="term">Effects:</span></dt>
11044<dd><p>
11045                    Interrupts and joins all the threads and then destroys the threads.
11046                  </p></dd>
11047<dt><span class="term">Synchronization:</span></dt>
11048<dd><p>
11049                    The completion of all the closures happen before the completion
11050                    of the executor destructor.
11051                  </p></dd>
11052</dl>
11053</div>
11054</div>
11055</div>
11056<div class="section">
11057<div class="titlepage"><div><div><h5 class="title">
11058<a name="thread.synchronization.executors.ref.thread_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.thread_executor" title="Class thread_executor">Class
11059          <code class="computeroutput"><span class="identifier">thread_executor</span></code></a>
11060</h5></div></div></div>
11061<p>
11062            A thread_executor with a threads for each task.
11063          </p>
11064<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">thread_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
11065<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
11066  <span class="keyword">class</span> <span class="identifier">thread_executor</span>
11067  <span class="special">{</span>
11068  <span class="keyword">public</span><span class="special">:</span>
11069
11070    <span class="identifier">thread_executor</span><span class="special">(</span><span class="identifier">thread_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
11071    <span class="identifier">thread_executor</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">thread_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>
11072
11073    <span class="identifier">thread_executor</span><span class="special">();</span>
11074    <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>
11075    <span class="identifier">basic_thread_pool</span><span class="special">(</span> <span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">thread_count</span><span class="special">,</span> <span class="identifier">AtThreadEntry</span> <span class="identifier">at_thread_entry</span><span class="special">);</span>
11076    <span class="special">~</span><span class="identifier">thread_executor</span><span class="special">();</span>
11077
11078    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
11079    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
11080
11081    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
11082    <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>
11083
11084  <span class="special">};</span>
11085<span class="special">}</span>
11086</pre>
11087<div class="section">
11088<div class="titlepage"><div><div><h6 class="title">
11089<a name="thread.synchronization.executors.ref.thread_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.thread_executor.constructor" title="Constructor thread_executor()">Constructor
11090            <code class="computeroutput"><span class="identifier">thread_executor</span><span class="special">()</span></code></a>
11091</h6></div></div></div>
11092<div class="variablelist">
11093<p class="title"><b></b></p>
11094<dl class="variablelist">
11095<dt><span class="term">Effects:</span></dt>
11096<dd><p>
11097                    creates a thread_executor.
11098                  </p></dd>
11099<dt><span class="term">Throws:</span></dt>
11100<dd><p>
11101                    Whatever exception is thrown while initializing the needed resources.
11102                  </p></dd>
11103</dl>
11104</div>
11105</div>
11106<div class="section">
11107<div class="titlepage"><div><div><h6 class="title">
11108<a name="thread.synchronization.executors.ref.thread_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.thread_executor.destructor" title="Destructor ~thread_executor()">Destructor
11109            <code class="computeroutput"><span class="special">~</span><span class="identifier">thread_executor</span><span class="special">()</span></code></a>
11110</h6></div></div></div>
11111<pre class="programlisting"><span class="special">~</span><span class="identifier">thread_executor</span><span class="special">();</span>
11112</pre>
11113<div class="variablelist">
11114<p class="title"><b></b></p>
11115<dl class="variablelist">
11116<dt><span class="term">Effects:</span></dt>
11117<dd><p>
11118                    Waits for closures (if any) to complete, then joins and destroys
11119                    the threads.
11120                  </p></dd>
11121<dt><span class="term">Synchronization:</span></dt>
11122<dd><p>
11123                    The completion of all the closures happen before the completion
11124                    of the executor destructor.
11125                  </p></dd>
11126</dl>
11127</div>
11128</div>
11129</div>
11130<div class="section">
11131<div class="titlepage"><div><div><h5 class="title">
11132<a name="thread.synchronization.executors.ref.loop_executor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor" title="Class loop_executor">Class
11133          <code class="computeroutput"><span class="identifier">loop_executor</span></code></a>
11134</h5></div></div></div>
11135<p>
11136            A user scheduled executor.
11137          </p>
11138<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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">loop_executor</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
11139<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
11140  <span class="keyword">class</span> <span class="identifier">loop_executor</span>
11141  <span class="special">{</span>
11142  <span class="keyword">public</span><span class="special">:</span>
11143
11144    <span class="identifier">loop_executor</span><span class="special">(</span><span class="identifier">loop_executor</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
11145    <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>
11146
11147    <span class="identifier">loop_executor</span><span class="special">();</span>
11148    <span class="special">~</span><span class="identifier">loop_executor</span><span class="special">();</span>
11149
11150    <span class="keyword">void</span> <span class="identifier">close</span><span class="special">();</span>
11151    <span class="keyword">bool</span> <span class="identifier">closed</span><span class="special">();</span>
11152
11153    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Closure</span><span class="special">&gt;</span>
11154    <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>
11155
11156    <span class="keyword">bool</span> <span class="identifier">try_executing_one</span><span class="special">();</span>
11157    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pred</span><span class="special">&gt;</span>
11158    <span class="keyword">bool</span> <span class="identifier">reschedule_until</span><span class="special">(</span><span class="identifier">Pred</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">pred</span><span class="special">);</span>
11159
11160    <span class="keyword">void</span> <span class="identifier">loop</span><span class="special">();</span>
11161    <span class="keyword">void</span> <span class="identifier">run_queued_closures</span><span class="special">();</span>
11162  <span class="special">};</span>
11163<span class="special">}</span>
11164</pre>
11165<div class="section">
11166<div class="titlepage"><div><div><h6 class="title">
11167<a name="thread.synchronization.executors.ref.loop_executor.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.constructor" title="Constructor loop_executor()">Constructor
11168            <code class="computeroutput"><span class="identifier">loop_executor</span><span class="special">()</span></code></a>
11169</h6></div></div></div>
11170<pre class="programlisting"><span class="identifier">loop_executor</span><span class="special">();</span>
11171</pre>
11172<div class="variablelist">
11173<p class="title"><b></b></p>
11174<dl class="variablelist">
11175<dt><span class="term">Effects:</span></dt>
11176<dd><p>
11177                    creates an executor that runs closures using one of its closure-executing
11178                    methods.
11179                  </p></dd>
11180<dt><span class="term">Throws:</span></dt>
11181<dd><p>
11182                    Whatever exception is thrown while initializing the needed resources.
11183                  </p></dd>
11184</dl>
11185</div>
11186</div>
11187<div class="section">
11188<div class="titlepage"><div><div><h6 class="title">
11189<a name="thread.synchronization.executors.ref.loop_executor.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.destructor" title="Destructor ~loop_executor()">Destructor
11190            <code class="computeroutput"><span class="special">~</span><span class="identifier">loop_executor</span><span class="special">()</span></code></a>
11191</h6></div></div></div>
11192<pre class="programlisting"><span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">loop_executor</span><span class="special">();</span>
11193</pre>
11194<div class="variablelist">
11195<p class="title"><b></b></p>
11196<dl class="variablelist">
11197<dt><span class="term">Effects:</span></dt>
11198<dd><p>
11199                    Destroys the executor.
11200                  </p></dd>
11201<dt><span class="term">Synchronization:</span></dt>
11202<dd><p>
11203                    The completion of all the closures happen before the completion
11204                    of the executor destructor.
11205                  </p></dd>
11206</dl>
11207</div>
11208</div>
11209<div class="section">
11210<div class="titlepage"><div><div><h6 class="title">
11211<a name="thread.synchronization.executors.ref.loop_executor.loop"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.loop" title="Function member loop()">Function
11212            member <code class="computeroutput"><span class="identifier">loop</span><span class="special">()</span></code></a>
11213</h6></div></div></div>
11214<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">loop</span><span class="special">();</span>
11215</pre>
11216<div class="variablelist">
11217<p class="title"><b></b></p>
11218<dl class="variablelist">
11219<dt><span class="term">Return:</span></dt>
11220<dd><p>
11221                    reschedule works until <code class="computeroutput"><span class="identifier">closed</span><span class="special">()</span></code> or empty.
11222                  </p></dd>
11223<dt><span class="term">Throws:</span></dt>
11224<dd><p>
11225                    whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
11226                    throws.
11227                  </p></dd>
11228</dl>
11229</div>
11230</div>
11231<div class="section">
11232<div class="titlepage"><div><div><h6 class="title">
11233<a name="thread.synchronization.executors.ref.loop_executor.run_queued_closures"></a><a class="link" href="synchronization.html#thread.synchronization.executors.ref.loop_executor.run_queued_closures" title="Function member run_queued_closures()">Function
11234            member <code class="computeroutput"><span class="identifier">run_queued_closures</span><span class="special">()</span></code></a>
11235</h6></div></div></div>
11236<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">run_queued_closures</span><span class="special">();</span>
11237</pre>
11238<div class="variablelist">
11239<p class="title"><b></b></p>
11240<dl class="variablelist">
11241<dt><span class="term">Return:</span></dt>
11242<dd><p>
11243                    reschedule the enqueued works.
11244                  </p></dd>
11245<dt><span class="term">Throws:</span></dt>
11246<dd><p>
11247                    whatever the current work constructor throws or the <code class="computeroutput"><span class="identifier">work</span><span class="special">()</span></code>
11248                    throws.
11249                  </p></dd>
11250</dl>
11251</div>
11252</div>
11253</div>
11254</div>
11255</div>
11256<div class="section">
11257<div class="titlepage"><div><div><h3 class="title">
11258<a name="thread.synchronization.futures"></a><a class="link" href="synchronization.html#thread.synchronization.futures" title="Futures">Futures</a>
11259</h3></div></div></div>
11260<div class="toc"><dl class="toc">
11261<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.overview">Overview</a></span></dt>
11262<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.creating">Creating asynchronous
11263        values</a></span></dt>
11264<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.lazy_futures">Wait Callbacks
11265        and Lazy Futures</a></span></dt>
11266<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.at_thread_exit">Handling
11267        Detached Threads and Thread Specific Variables</a></span></dt>
11268<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.async">Executing asynchronously</a></span></dt>
11269<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.shared">Shared Futures</a></span></dt>
11270<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.make_ready_future">Making
11271        immediate futures easier</a></span></dt>
11272<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.then">Associating future
11273        continuations</a></span></dt>
11274<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference">Futures Reference</a></span></dt>
11275</dl></div>
11276<div class="section">
11277<div class="titlepage"><div><div><h4 class="title">
11278<a name="thread.synchronization.futures.overview"></a><a class="link" href="synchronization.html#thread.synchronization.futures.overview" title="Overview">Overview</a>
11279</h4></div></div></div>
11280<p>
11281          The futures library provides a means of handling synchronous future values,
11282          whether those values are generated by another thread, or on a single thread
11283          in response to external stimuli, or on-demand.
11284        </p>
11285<p>
11286          This is done through the provision of four class templates: <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> which are used to
11287          retrieve the asynchronous results, and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> which are used to
11288          generate the asynchronous results.
11289        </p>
11290<p>
11291          An instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> holds the one and only
11292          reference to a result. Ownership can be transferred between instances using
11293          the move constructor or move-assignment operator, but at most one instance
11294          holds a reference to a given asynchronous result. When the result is ready,
11295          it is returned from <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code></a>
11296          by rvalue-reference to allow the result to be moved or copied as appropriate
11297          for the type.
11298        </p>
11299<p>
11300          On the other hand, many instances of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> may reference the
11301          same result. Instances can be freely copied and assigned, and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code></a>
11302          returns a <code class="computeroutput"><span class="keyword">const</span></code> reference
11303          so that multiple calls to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code></a>
11304          are safe. You can move an instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> into an instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, thus transferring
11305          ownership of the associated asynchronous result, but not vice-versa.
11306        </p>
11307<p>
11308          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> is a simple way of running asynchronous
11309          tasks. A call to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code>
11310          returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> that will contain the result
11311          of the task.
11312        </p>
11313<p>
11314          You can wait for futures either individually or with one of the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_any" title="Non-member function wait_for_any() - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">wait_for_any</span><span class="special">()</span></code></a>
11315          and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_all" title="Non-member function wait_for_all() - EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">wait_for_all</span><span class="special">()</span></code></a>
11316          functions.
11317        </p>
11318</div>
11319<div class="section">
11320<div class="titlepage"><div><div><h4 class="title">
11321<a name="thread.synchronization.futures.creating"></a><a class="link" href="synchronization.html#thread.synchronization.futures.creating" title="Creating asynchronous values">Creating asynchronous
11322        values</a>
11323</h4></div></div></div>
11324<p>
11325          You can set the value in a future with either a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. A <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> is a callable object
11326          that wraps a function or callable object. When the packaged task is invoked,
11327          it invokes the contained function in turn, and populates a future with
11328          the return value. This is an answer to the perennial question: "how
11329          do I return a value from a thread?": package the function you wish
11330          to run as a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> and pass the packaged
11331          task to the thread constructor. The future retrieved from the packaged
11332          task can then be used to obtain the return value. If the function throws
11333          an exception, that is stored in the future in place of the return value.
11334        </p>
11335<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">()</span>
11336<span class="special">{</span>
11337    <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span>
11338<span class="special">}</span>
11339
11340<span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special">&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>
11341<span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
11342
11343<span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">task</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">pt</span><span class="special">));</span> <span class="comment">// launch task on a thread</span>
11344
11345<span class="identifier">fi</span><span class="special">.</span><span class="identifier">wait</span><span class="special">();</span> <span class="comment">// wait for it to finish</span>
11346
11347<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">());</span>
11348<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_value</span><span class="special">());</span>
11349<span class="identifier">assert</span><span class="special">(!</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_exception</span><span class="special">());</span>
11350<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get_state</span><span class="special">()==</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span><span class="special">);</span>
11351<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span>
11352</pre>
11353<p>
11354          A <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> is a bit more low level:
11355          it just provides explicit functions to store a value or an exception in
11356          the associated future. A promise can therefore be used where the value
11357          may come from more than one possible source, or where a single operation
11358          may produce multiple values.
11359        </p>
11360<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">pi</span><span class="special">;</span>
11361<span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">fi</span><span class="special">;</span>
11362<span class="identifier">fi</span><span class="special">=</span><span class="identifier">pi</span><span class="special">.</span><span class="identifier">get_future</span><span class="special">();</span>
11363
11364<span class="identifier">pi</span><span class="special">.</span><span class="identifier">set_value</span><span class="special">(</span><span class="number">42</span><span class="special">);</span>
11365
11366<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">is_ready</span><span class="special">());</span>
11367<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_value</span><span class="special">());</span>
11368<span class="identifier">assert</span><span class="special">(!</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">has_exception</span><span class="special">());</span>
11369<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get_state</span><span class="special">()==</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span><span class="special">);</span>
11370<span class="identifier">assert</span><span class="special">(</span><span class="identifier">fi</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span>
11371</pre>
11372</div>
11373<div class="section">
11374<div class="titlepage"><div><div><h4 class="title">
11375<a name="thread.synchronization.futures.lazy_futures"></a><a class="link" href="synchronization.html#thread.synchronization.futures.lazy_futures" title="Wait Callbacks and Lazy Futures">Wait Callbacks
11376        and Lazy Futures</a>
11377</h4></div></div></div>
11378<p>
11379          Both <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> support <span class="emphasis"><em>wait
11380          callbacks</em></span> that are invoked when a thread blocks in a call to
11381          <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
11382          or <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
11383          on a future that is waiting for the result from the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>, in the thread that
11384          is doing the waiting. These can be set using the <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> member function on the <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> in question.
11385        </p>
11386<p>
11387          This allows <span class="emphasis"><em>lazy futures</em></span> where the result is not actually
11388          computed until it is needed by some thread. In the example below, the call
11389          to <code class="computeroutput"><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>
11390          invokes the callback <code class="computeroutput"><span class="identifier">invoke_lazy_task</span></code>,
11391          which runs the task to set the value. If you remove the call to <code class="computeroutput"><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span></code>, the task is not ever run.
11392        </p>
11393<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">calculate_the_answer_to_life_the_universe_and_everything</span><span class="special">()</span>
11394<span class="special">{</span>
11395    <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span>
11396<span class="special">}</span>
11397
11398<span class="keyword">void</span> <span class="identifier">invoke_lazy_task</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;&amp;</span> <span class="identifier">task</span><span class="special">)</span>
11399<span class="special">{</span>
11400    <span class="keyword">try</span>
11401    <span class="special">{</span>
11402        <span class="identifier">task</span><span class="special">();</span>
11403    <span class="special">}</span>
11404    <span class="keyword">catch</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span><span class="special">&amp;)</span>
11405    <span class="special">{}</span>
11406<span class="special">}</span>
11407
11408<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
11409<span class="special">{</span>
11410    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special">&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>
11411    <span class="identifier">task</span><span class="special">.</span><span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">invoke_lazy_task</span><span class="special">);</span>
11412    <span class="identifier">boost</span><span class="special">::</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
11413
11414    <span class="identifier">assert</span><span class="special">(</span><span class="identifier">f</span><span class="special">.</span><span class="identifier">get</span><span class="special">()==</span><span class="number">42</span><span class="special">);</span>
11415<span class="special">}</span>
11416</pre>
11417</div>
11418<div class="section">
11419<div class="titlepage"><div><div><h4 class="title">
11420<a name="thread.synchronization.futures.at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.at_thread_exit" title="Handling Detached Threads and Thread Specific Variables">Handling
11421        Detached Threads and Thread Specific Variables</a>
11422</h4></div></div></div>
11423<p>
11424          Detached threads pose a problem for objects with thread storage duration.
11425          If we use a mechanism other than <code class="computeroutput"><span class="identifier">thread</span><span class="special">::</span><span class="identifier">__join</span></code>
11426          to wait for a <a class="link" href="thread_management.html#thread.thread_management.thread" title="Class thread"><code class="computeroutput"><span class="identifier">thread</span></code></a> to complete its work -
11427          such as waiting for a future to be ready - then the destructors of thread
11428          specific variables will still be running after the waiting thread has resumed.
11429          This section explain how the standard mechanism can be used to make such
11430          synchronization safe by ensuring that the objects with thread storage duration
11431          are destroyed prior to the future being made ready. e.g.
11432        </p>
11433<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">find_the_answer</span><span class="special">();</span> <span class="comment">// uses thread specific objects</span>
11434<span class="keyword">void</span> <span class="identifier">thread_func</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;&amp;&amp;</span> <span class="identifier">p</span><span class="special">)</span>
11435<span class="special">{</span>
11436    <span class="identifier">p</span><span class="special">.</span><span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">find_the_answer</span><span class="special">());</span>
11437<span class="special">}</span>
11438
11439<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
11440<span class="special">{</span>
11441    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">p</span><span class="special">;</span>
11442    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread</span> <span class="identifier">t</span><span class="special">(</span><span class="identifier">thread_func</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">p</span><span class="special">));</span>
11443    <span class="identifier">t</span><span class="special">.</span><span class="identifier">detach</span><span class="special">();</span> <span class="comment">// we're going to wait on the future</span>
11444    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&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>
11445<span class="special">}</span>
11446</pre>
11447<p>
11448          When the call to <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
11449          returns, we know that not only is the future value ready, but the thread
11450          specific variables on the other thread have also been destroyed.
11451        </p>
11452<p>
11453          Such mechanisms are provided for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span></code>,
11454          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code> and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code>.
11455          e.g.
11456        </p>
11457<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">task_executor</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span><span class="special">&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>
11458<span class="special">{</span>
11459    <span class="identifier">task</span><span class="special">.</span><span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">param</span><span class="special">);</span> <span class="comment">// execute stored task</span>
11460<span class="special">}</span> <span class="comment">// destroy thread specific and wake threads waiting on futures from task</span>
11461</pre>
11462<p>
11463          Other threads can wait on a future obtained from the task without having
11464          to worry about races due to the execution of destructors of the thread
11465          specific objects from the task's thread.
11466        </p>
11467<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">condition_variable</span> <span class="identifier">cv</span><span class="special">;</span>
11468<span class="identifier">boost</span><span class="special">::</span><span class="identifier">mutex</span> <span class="identifier">m</span><span class="special">;</span>
11469<span class="identifier">complex_type</span> <span class="identifier">the_data</span><span class="special">;</span>
11470<span class="keyword">bool</span> <span class="identifier">data_ready</span><span class="special">;</span>
11471
11472<span class="keyword">void</span> <span class="identifier">thread_func</span><span class="special">()</span>
11473<span class="special">{</span>
11474    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
11475    <span class="identifier">the_data</span><span class="special">=</span><span class="identifier">find_the_answer</span><span class="special">();</span>
11476    <span class="identifier">data_ready</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
11477    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">notify_all_at_thread_exit</span><span class="special">(</span><span class="identifier">cv</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">lk</span><span class="special">));</span>
11478<span class="special">}</span> <span class="comment">// destroy thread specific objects, notify cv, unlock mutex</span>
11479
11480<span class="keyword">void</span> <span class="identifier">waiting_thread</span><span class="special">()</span>
11481<span class="special">{</span>
11482    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unique_lock</span><span class="special">&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>
11483    <span class="keyword">while</span><span class="special">(!</span><span class="identifier">data_ready</span><span class="special">)</span>
11484    <span class="special">{</span>
11485        <span class="identifier">cv</span><span class="special">.</span><span class="identifier">wait</span><span class="special">(</span><span class="identifier">lk</span><span class="special">);</span>
11486    <span class="special">}</span>
11487    <span class="identifier">process</span><span class="special">(</span><span class="identifier">the_data</span><span class="special">);</span>
11488<span class="special">}</span>
11489</pre>
11490<p>
11491          The waiting thread is guaranteed that the thread specific objects used
11492          by <code class="computeroutput"><span class="identifier">thread_func</span><span class="special">()</span></code>
11493          have been destroyed by the time <code class="computeroutput"><span class="identifier">process</span><span class="special">(</span><span class="identifier">the_data</span><span class="special">)</span></code> is called. If the lock on <code class="computeroutput"><span class="identifier">m</span></code> is released and re-acquired after setting
11494          <code class="computeroutput"><span class="identifier">data_ready</span></code> and before calling
11495          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">notify_all_at_thread_exit</span><span class="special">()</span></code>
11496          then this does NOT hold, since the thread may return from the wait due
11497          to a spurious wake-up.
11498        </p>
11499</div>
11500<div class="section">
11501<div class="titlepage"><div><div><h4 class="title">
11502<a name="thread.synchronization.futures.async"></a><a class="link" href="synchronization.html#thread.synchronization.futures.async" title="Executing asynchronously">Executing asynchronously</a>
11503</h4></div></div></div>
11504<p>
11505          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> is a simple way of running asynchronous
11506          tasks to make use of the available hardware concurrency. A call to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span></code> returns a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span></code>
11507          that will contain the result of the task. Depending on the launch policy,
11508          the task is either run asynchronously on its own thread or synchronously
11509          on whichever thread calls the <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> member functions on that <code class="computeroutput"><span class="identifier">future</span></code>.
11510        </p>
11511<p>
11512          A launch policy of either boost::launch::async, which asks the runtime
11513          to create an asynchronous thread, or boost::launch::deferred, which indicates
11514          you simply want to defer the function call until a later time (lazy evaluation).
11515          This argument is optional - if you omit it your function will use the default
11516          policy.
11517        </p>
11518<p>
11519          For example, consider computing the sum of a very large array. The first
11520          task is to not compute asynchronously when the overhead would be significant.
11521          The second task is to split the work into two pieces, one executed by the
11522          host thread and one executed asynchronously.
11523        </p>
11524<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">parallel_sum</span><span class="special">(</span><span class="keyword">int</span><span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">size</span><span class="special">)</span>
11525<span class="special">{</span>
11526  <span class="keyword">int</span> <span class="identifier">sum</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
11527  <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">size</span> <span class="special">&lt;</span> <span class="number">1000</span> <span class="special">)</span>
11528    <span class="keyword">for</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span>
11529      <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">data</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
11530  <span class="keyword">else</span> <span class="special">{</span>
11531    <span class="keyword">auto</span> <span class="identifier">handle</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">async</span><span class="special">(</span><span class="identifier">parallel_sum</span><span class="special">,</span> <span class="identifier">data</span><span class="special">+</span><span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">,</span> <span class="identifier">size</span><span class="special">-</span><span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">);</span>
11532    <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">parallel_sum</span><span class="special">(</span><span class="identifier">data</span><span class="special">,</span> <span class="identifier">size</span><span class="special">/</span><span class="number">2</span><span class="special">);</span>
11533    <span class="identifier">sum</span> <span class="special">+=</span> <span class="identifier">handle</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span>
11534  <span class="special">}</span>
11535  <span class="keyword">return</span> <span class="identifier">sum</span><span class="special">;</span>
11536<span class="special">}</span>
11537</pre>
11538</div>
11539<div class="section">
11540<div class="titlepage"><div><div><h4 class="title">
11541<a name="thread.synchronization.futures.shared"></a><a class="link" href="synchronization.html#thread.synchronization.futures.shared" title="Shared Futures">Shared Futures</a>
11542</h4></div></div></div>
11543<p>
11544          <code class="computeroutput"><span class="identifier">shared_future</span></code> is designed
11545          to be shared between threads, that is to allow multiple concurrent get
11546          operations.
11547        </p>
11548<h6>
11549<a name="thread.synchronization.futures.shared.h0"></a>
11550          <span class="phrase"><a name="thread.synchronization.futures.shared.multiple_get"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.multiple_get">Multiple get</a>
11551        </h6>
11552<p>
11553          The second <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
11554          call in the following example is undefined.
11555        </p>
11556<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">bad_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span>
11557
11558  <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">);</span>
11559    <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
11560    <span class="special">{</span>
11561        <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
11562    <span class="special">}</span> <span class="keyword">else</span>
11563    <span class="special">{</span>
11564        <span class="identifier">use2</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
11565    <span class="special">}</span>
11566    <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is undefined</span>
11567<span class="special">}</span>
11568</pre>
11569<p>
11570          Using a <code class="computeroutput"><span class="identifier">shared_future</span></code> solves
11571          the issue
11572        </p>
11573<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">good_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span>
11574
11575   <span class="identifier">shared_future</span><span class="special">&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>
11576    <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
11577    <span class="special">{</span>
11578        <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
11579    <span class="special">}</span> <span class="keyword">else</span>
11580    <span class="special">{</span>
11581        <span class="identifier">use2</span><span class="special">(</span>  <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
11582    <span class="special">}</span>
11583    <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span>
11584<span class="special">}</span>
11585</pre>
11586<h6>
11587<a name="thread.synchronization.futures.shared.h1"></a>
11588          <span class="phrase"><a name="thread.synchronization.futures.shared.share__"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.share__">share()</a>
11589        </h6>
11590<p>
11591          Naming the return type when declaring the <code class="computeroutput"><span class="identifier">shared_future</span></code>
11592          is needed; auto is not available within template argument lists. Here
11593          <code class="computeroutput"><span class="identifier">share</span><span class="special">()</span></code>
11594          could be used to simplify the code
11595        </p>
11596<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">better_second_use</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span>
11597
11598   <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">).</span><span class="identifier">share</span><span class="special">();</span>
11599    <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
11600    <span class="special">{</span>
11601        <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
11602    <span class="special">}</span> <span class="keyword">else</span>
11603    <span class="special">{</span>
11604        <span class="identifier">use2</span><span class="special">(</span>  <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
11605    <span class="special">}</span>
11606    <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span>
11607<span class="special">}</span>
11608</pre>
11609<h6>
11610<a name="thread.synchronization.futures.shared.h2"></a>
11611          <span class="phrase"><a name="thread.synchronization.futures.shared.writing_on_get__"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.shared.writing_on_get__">Writing
11612          on get()</a>
11613        </h6>
11614<p>
11615          The user can either read or write the future variable.
11616        </p>
11617<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">write_to_get</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">arg</span> <span class="special">)</span> <span class="special">{</span>
11618
11619   <span class="keyword">auto</span> <span class="identifier">ftr</span> <span class="special">=</span> <span class="identifier">async</span><span class="special">(</span> <span class="special">[=]{</span> <span class="keyword">return</span> <span class="identifier">work</span><span class="special">(</span> <span class="identifier">arg</span> <span class="special">);</span> <span class="special">}</span> <span class="special">).</span><span class="identifier">share</span><span class="special">();</span>
11620    <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond1</span> <span class="special">)</span>
11621    <span class="special">{</span>
11622        <span class="identifier">use1</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
11623    <span class="special">}</span> <span class="keyword">else</span>
11624    <span class="special">{</span>
11625      <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">cond2</span> <span class="special">)</span>
11626        <span class="identifier">use2</span><span class="special">(</span>  <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span>
11627      <span class="keyword">else</span>
11628        <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">=</span> <span class="identifier">something</span><span class="special">();</span> <span class="comment">// assign to non-const reference.  </span>
11629    <span class="special">}</span>
11630    <span class="identifier">use3</span><span class="special">(</span> <span class="identifier">ftr</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">);</span> <span class="comment">// second use is defined</span>
11631<span class="special">}</span>
11632</pre>
11633<p>
11634          This works because the <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;&gt;::</span><span class="identifier">get</span><span class="special">()</span></code> function returns a non-const reference
11635          to the appropriate storage. Of course the access to this storage must be
11636          ensured by the user. The library doesn't ensure the access to the internal
11637          storage is thread safe.
11638        </p>
11639<p>
11640          There has been some work by the C++ standard committee on an <code class="computeroutput"><span class="identifier">atomic_future</span></code> that behaves as an <code class="computeroutput"><span class="identifier">atomic</span></code> variable, that is thread_safe,
11641          and a <code class="computeroutput"><span class="identifier">shared_future</span></code> that
11642          can be shared between several threads, but there were not enough consensus
11643          and time to get it ready for C++11.
11644        </p>
11645</div>
11646<div class="section">
11647<div class="titlepage"><div><div><h4 class="title">
11648<a name="thread.synchronization.futures.make_ready_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.make_ready_future" title="Making immediate futures easier">Making
11649        immediate futures easier</a>
11650</h4></div></div></div>
11651<p>
11652          Some functions may know the value at the point of construction. In these
11653          cases the value is immediately available, but needs to be returned as a
11654          future or shared_future. By using make_ready_future a future can be created
11655          which holds a pre-computed result in its shared state.
11656        </p>
11657<p>
11658          Without these features it is non-trivial to create a future directly from
11659          a value. First a promise must be created, then the promise is set, and
11660          lastly the future is retrieved from the promise. This can now be done with
11661          one operation.
11662        </p>
11663<h6>
11664<a name="thread.synchronization.futures.make_ready_future.h0"></a>
11665          <span class="phrase"><a name="thread.synchronization.futures.make_ready_future.make_ready_future"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.make_ready_future.make_ready_future">make_ready_future</a>
11666        </h6>
11667<p>
11668          This function creates a future for a given value. If no value is given
11669          then a future&lt;void&gt; is returned. This function is primarily useful
11670          in cases where sometimes, the return value is immediately available, but
11671          sometimes it is not. The example below illustrates, that in an error path
11672          the value is known immediately, however in other paths the function must
11673          return an eventual value represented as a future.
11674        </p>
11675<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&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>
11676<span class="special">{</span>
11677  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_ready_future</span><span class="special">(</span><span class="number">0</span><span class="special">);</span>
11678  <span class="keyword">if</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">&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>
11679  <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>
11680  <span class="keyword">return</span> <span class="identifier">f1</span><span class="special">;</span>
11681<span class="special">}</span>
11682</pre>
11683<p>
11684          There are two variations of this function. The first takes a value of any
11685          type, and returns a future of that type. The input value is passed to the
11686          shared state of the returned future. The second version takes no input
11687          and returns a future&lt;void&gt;.
11688        </p>
11689</div>
11690<div class="section">
11691<div class="titlepage"><div><div><h4 class="title">
11692<a name="thread.synchronization.futures.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.then" title="Associating future continuations">Associating future
11693        continuations</a>
11694</h4></div></div></div>
11695<p>
11696          In asynchronous programming, it is very common for one asynchronous operation,
11697          on completion, to invoke a second operation and pass data to it. The current
11698          C++ standard does not allow one to register a continuation to a future.
11699          With <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code>,
11700          instead of waiting for the result, a continuation is "attached"
11701          to the asynchronous operation, which is invoked when the result is ready.
11702          Continuations registered using the <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code> function will help to avoid blocking
11703          waits or wasting threads on polling, greatly improving the responsiveness
11704          and scalability of an application.
11705        </p>
11706<p>
11707          <code class="computeroutput"><span class="identifier">future</span><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>
11708          provides the ability to sequentially compose two futures by declaring one
11709          to be the continuation of another. With <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>
11710          the antecedent future is ready (has a value or exception stored in the
11711          shared state) before the continuation starts as instructed by the lambda
11712          function.
11713        </p>
11714<p>
11715          In the example below the <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span></code> <code class="computeroutput"><span class="identifier">f2</span></code>
11716          is registered to be a continuation of <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code> <code class="computeroutput"><span class="identifier">f1</span></code>
11717          using the <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code> member function. This operation takes
11718          a lambda function which describes how <code class="computeroutput"><span class="identifier">f2</span></code>
11719          should proceed after <code class="computeroutput"><span class="identifier">f1</span></code>
11720          is ready.
11721        </p>
11722<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&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>
11723<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
11724<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
11725<span class="special">{</span>
11726  <span class="identifier">future</span><span class="special">&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>
11727  <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>
11728<span class="special">}</span>
11729</pre>
11730<p>
11731          One key feature of this function is the ability to chain multiple asynchronous
11732          operations. In asynchronous programming, it's common to define a sequence
11733          of operations, in which each continuation executes only when the previous
11734          one completes. In some cases, the antecedent future produces a value that
11735          the continuation accepts as input. By using <code class="computeroutput"><span class="identifier">future</span><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>, creating a chain of continuations becomes
11736          straightforward and intuitive:
11737        </p>
11738<pre class="programlisting"><span class="identifier">myFuture</span><span class="special">.</span><span class="identifier">then</span><span class="special">(...).</span><span class="identifier">then</span><span class="special">(...).</span><span class="identifier">then</span><span class="special">(...).</span>
11739</pre>
11740<p>
11741          Some points to note are:
11742        </p>
11743<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
11744<li class="listitem">
11745              Each continuation will not begin until the preceding has completed.
11746            </li>
11747<li class="listitem">
11748              If an exception is thrown, the following continuation can handle it
11749              in a try-catch block
11750            </li>
11751</ul></div>
11752<p>
11753          Input Parameters:
11754        </p>
11755<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
11756<li class="listitem">
11757              Lambda function: One option which can be considered is to take two
11758              functions, one for success and one for error handling. However this
11759              option has not been retained for the moment. The lambda function takes
11760              a future as its input which carries the exception through. This makes
11761              propagating exceptions straightforward. This approach also simplifies
11762              the chaining of continuations.
11763            </li>
11764<li class="listitem">
11765              Executor: Providing an overload to <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span></code>, to take an executor reference
11766              places great flexibility over the execution of the future in the programmer's
11767              hand. As described above, often taking a launch policy is not sufficient
11768              for powerful asynchronous operations. The lifetime of the executor
11769              must outlive the continuation.
11770            </li>
11771<li class="listitem">
11772              Launch policy: if the additional flexibility that the executor provides
11773              is not required.
11774            </li>
11775</ul></div>
11776<p>
11777          Return values: The decision to return a future was based primarily on the
11778          ability to chain multiple continuations using <code class="computeroutput"><span class="special">.</span><span class="identifier">then</span><span class="special">()</span></code>.
11779          This benefit of composability gives the programmer incredible control and
11780          flexibility over their code. Returning a <code class="computeroutput"><span class="identifier">future</span></code>
11781          object rather than a <code class="computeroutput"><span class="identifier">shared_future</span></code>
11782          is also a much cheaper operation thereby improving performance. A <code class="computeroutput"><span class="identifier">shared_future</span></code> object is not necessary
11783          to take advantage of the chaining feature. It is also easy to go from a
11784          <code class="computeroutput"><span class="identifier">future</span></code> to a <code class="computeroutput"><span class="identifier">shared_future</span></code> when needed using future::share().
11785        </p>
11786</div>
11787<div class="section">
11788<div class="titlepage"><div><div><h4 class="title">
11789<a name="thread.synchronization.futures.reference"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference" title="Futures Reference">Futures Reference</a>
11790</h4></div></div></div>
11791<div class="toc"><dl class="toc">
11792<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_state">Enumeration
11793          <code class="computeroutput"><span class="identifier">state</span></code></a></span></dt>
11794<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_errc">Enumeration
11795          <code class="computeroutput"><span class="identifier">future_errc</span></code></a></span></dt>
11796<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.launch">Enumeration
11797          <code class="computeroutput"><span class="identifier">launch</span></code></a></span></dt>
11798<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.is_error_code_enum">Specialization
11799          <code class="computeroutput"><span class="identifier">is_error_code_enum</span><span class="special">&lt;</span><span class="identifier">future_errc</span><span class="special">&gt;</span></code></a></span></dt>
11800<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_error_code">Non-member
11801          function <code class="computeroutput"><span class="identifier">make_error_code</span><span class="special">()</span></code></a></span></dt>
11802<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_error_condition">Non-member
11803          function <code class="computeroutput"><span class="identifier">make_error_condition</span><span class="special">()</span></code></a></span></dt>
11804<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_category">Non-member
11805          function <code class="computeroutput"><span class="identifier">future_category</span><span class="special">()</span></code></a></span></dt>
11806<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_error">Class
11807          <code class="computeroutput"><span class="identifier">future_error</span></code></a></span></dt>
11808<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_status">Enumeration
11809          <code class="computeroutput"><span class="identifier">future_status</span></code></a></span></dt>
11810<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.future_error0">Class
11811          <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> EXPERIMENTAL</a></span></dt>
11812<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.unique_future"><code class="computeroutput"><span class="identifier">future</span></code> class template</a></span></dt>
11813<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.shared_future"><code class="computeroutput"><span class="identifier">shared_future</span></code> class template</a></span></dt>
11814<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.promise"><code class="computeroutput"><span class="identifier">promise</span></code> class template</a></span></dt>
11815<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.packaged_task"><code class="computeroutput"><span class="identifier">packaged_task</span></code> class template</a></span></dt>
11816<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.decay_copy">Non-member
11817          function <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code></a></span></dt>
11818<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.async">Non-member
11819          function <code class="computeroutput"><span class="identifier">async</span><span class="special">()</span></code></a></span></dt>
11820<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.wait_for_any">Non-member
11821          function <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
11822          - EXTENSION</a></span></dt>
11823<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.wait_for_all">Non-member
11824          function <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
11825          - EXTENSION</a></span></dt>
11826<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.when_all">Non-member
11827          function <code class="computeroutput"><span class="identifier">when_all</span><span class="special">()</span></code>
11828          - EXTENSION</a></span></dt>
11829<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.when_any">Non-member
11830          function <code class="computeroutput"><span class="identifier">when_any</span><span class="special">()</span></code>
11831          - EXTENSION</a></span></dt>
11832<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_ready_future">Non-member
11833          function <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> EXTENSION</a></span></dt>
11834<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_exceptional_future">Non-member
11835          function <code class="computeroutput"><span class="identifier">make_exceptional_future</span><span class="special">()</span></code> EXTENSION</a></span></dt>
11836<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_future">Non-member
11837          function <code class="computeroutput"><span class="identifier">make_future</span><span class="special">()</span></code>
11838          DEPRECATED</a></span></dt>
11839<dt><span class="section"><a href="synchronization.html#thread.synchronization.futures.reference.make_shared_future">Non-member
11840          function <code class="computeroutput"><span class="identifier">make_shared_future</span><span class="special">()</span></code> DEPRECATED</a></span></dt>
11841</dl></div>
11842<pre class="programlisting"><span class="comment">//#include &lt;boost/thread/future.hpp&gt;</span>
11843
11844<span class="keyword">namespace</span> <span class="identifier">boost</span>
11845<span class="special">{</span>
11846  <span class="keyword">namespace</span> <span class="identifier">future_state</span>  <span class="comment">// EXTENSION</span>
11847  <span class="special">{</span>
11848    <span class="keyword">enum</span> <span class="identifier">state</span> <span class="special">{</span><span class="identifier">uninitialized</span><span class="special">,</span> <span class="identifier">waiting</span><span class="special">,</span> <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">moved</span><span class="special">};</span>
11849  <span class="special">}</span>
11850
11851  <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_errc</span>
11852  <span class="special">{</span>
11853    <span class="identifier">broken_promise</span><span class="special">,</span>
11854    <span class="identifier">future_already_retrieved</span><span class="special">,</span>
11855    <span class="identifier">promise_already_satisfied</span><span class="special">,</span>
11856    <span class="identifier">no_state</span>
11857  <span class="special">};</span>
11858
11859  <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">launch</span>
11860  <span class="special">{</span>
11861    <span class="identifier">none</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11862    <span class="identifier">async</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11863    <span class="identifier">deferred</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11864    <span class="identifier">executor</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11865    <span class="identifier">inherit</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
11866    <span class="identifier">any</span> <span class="special">=</span> <span class="identifier">async</span> <span class="special">|</span> <span class="identifier">deferred</span>
11867  <span class="special">};</span>
11868
11869  <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_status</span> <span class="special">{</span>
11870    <span class="identifier">ready</span><span class="special">,</span>  <span class="identifier">timeout</span><span class="special">,</span> <span class="identifier">deferred</span>
11871  <span class="special">};</span>
11872
11873  <span class="keyword">namespace</span> <span class="identifier">system</span>
11874  <span class="special">{</span>
11875    <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
11876    <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>
11877
11878    <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span>
11879
11880    <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span>
11881  <span class="special">}</span>
11882
11883  <span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span><span class="special">&amp;</span> <span class="identifier">future_category</span><span class="special">();</span>
11884
11885  <span class="keyword">class</span> <span class="identifier">future_error</span><span class="special">;</span>
11886
11887  <span class="keyword">class</span> <span class="identifier">exceptional_ptr</span><span class="special">;</span>
11888
11889  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
11890  <span class="keyword">class</span> <span class="identifier">promise</span><span class="special">;</span>
11891
11892  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
11893  <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>
11894
11895  <span class="keyword">namespace</span> <span class="identifier">container</span> <span class="special">{</span>
11896    <span class="keyword">template</span> <span class="special">&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>
11897    <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>
11898  <span class="special">}</span>
11899
11900  <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>
11901  <span class="keyword">class</span> <span class="identifier">future</span><span class="special">;</span>
11902
11903  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
11904  <span class="keyword">class</span> <span class="identifier">shared_future</span><span class="special">;</span>
11905
11906  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">&gt;</span>
11907  <span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">;</span>
11908  <span class="keyword">template</span> <span class="special">&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>
11909
11910  <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>
11911  <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>
11912
11913  <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>
11914    <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>
11915    <span class="identifier">async</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
11916  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
11917    <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>
11918    <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
11919
11920  <span class="keyword">template</span> <span class="special">&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>
11921    <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>
11922    <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>
11923  <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>
11924    <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>
11925    <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&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>
11926  <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>
11927    <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>
11928    <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>
11929
11930  <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>
11931    <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11932  <span class="keyword">template</span><span class="special">&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>
11933    <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
11934
11935  <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>
11936    <span class="identifier">Iterator</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11937  <span class="keyword">template</span><span class="special">&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>
11938    <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
11939
11940  <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>
11941    <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>
11942    <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span>
11943  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">T</span><span class="special">&gt;</span>
11944    <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>
11945  <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>
11946    <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>
11947    <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
11948  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">T</span><span class="special">&gt;</span>
11949    <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>
11950
11951  <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>
11952    <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>
11953  <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>
11954
11955  <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>
11956    <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>
11957  <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>
11958
11959  <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
11960  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
11961    <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
11962  <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
11963
11964
11965  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
11966  <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>
11967  <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>
11968</pre>
11969<div class="section">
11970<div class="titlepage"><div><div><h5 class="title">
11971<a name="thread.synchronization.futures.reference.future_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state">Enumeration
11972          <code class="computeroutput"><span class="identifier">state</span></code></a>
11973</h5></div></div></div>
11974<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">future_state</span>
11975<span class="special">{</span>
11976  <span class="keyword">enum</span> <span class="identifier">state</span> <span class="special">{</span><span class="identifier">uninitialized</span><span class="special">,</span> <span class="identifier">waiting</span><span class="special">,</span> <span class="identifier">ready</span><span class="special">,</span> <span class="identifier">moved</span><span class="special">};</span>
11977<span class="special">}</span>
11978</pre>
11979</div>
11980<div class="section">
11981<div class="titlepage"><div><div><h5 class="title">
11982<a name="thread.synchronization.futures.reference.future_errc"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_errc" title="Enumeration future_errc">Enumeration
11983          <code class="computeroutput"><span class="identifier">future_errc</span></code></a>
11984</h5></div></div></div>
11985<pre class="programlisting"> <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_errc</span>
11986 <span class="special">{</span>
11987   <span class="identifier">broken_promise</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span>
11988   <span class="identifier">future_already_retrieved</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span>
11989   <span class="identifier">promise_already_satisfied</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span><span class="special">,</span>
11990   <span class="identifier">no_state</span> <span class="special">=</span> <span class="identifier">implementation</span> <span class="identifier">defined</span>
11991 <span class="special">}</span>
11992
11993
11994<span class="identifier">The</span> <span class="keyword">enum</span> <span class="identifier">values</span> <span class="identifier">of</span> <span class="identifier">future_errc</span> <span class="identifier">are</span> <span class="identifier">distinct</span> <span class="keyword">and</span> <span class="keyword">not</span> <span class="identifier">zero</span><span class="special">.</span>
11995</pre>
11996</div>
11997<div class="section">
11998<div class="titlepage"><div><div><h5 class="title">
11999<a name="thread.synchronization.futures.reference.launch"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.launch" title="Enumeration launch">Enumeration
12000          <code class="computeroutput"><span class="identifier">launch</span></code></a>
12001</h5></div></div></div>
12002<pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">launch</span>
12003<span class="special">{</span>
12004  <span class="identifier">none</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
12005  <span class="identifier">async</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
12006  <span class="identifier">deferred</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
12007  <span class="identifier">executor</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
12008  <span class="identifier">inherit</span> <span class="special">=</span> <span class="identifier">unspecified</span><span class="special">,</span>
12009  <span class="identifier">any</span> <span class="special">=</span> <span class="identifier">async</span> <span class="special">|</span> <span class="identifier">deferred</span>
12010<span class="special">};</span>
12011</pre>
12012<p>
12013            The enum type launch is a bitmask type with launch::async and launch::deferred
12014            denoting individual bits.
12015          </p>
12016<p>
12017            A future created with <code class="computeroutput"><span class="identifier">promise</span><span class="special">&lt;&gt;</span></code> or with a <code class="computeroutput"><span class="identifier">packaged_task</span><span class="special">&lt;&gt;</span></code> or with <code class="computeroutput"><span class="identifier">make_ready_future</span></code>/<code class="computeroutput"><span class="identifier">make_exceptional_future</span></code> (has no associated
12018            launch policy), has an implicit a launch policy of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">none</span></code>.
12019          </p>
12020<p>
12021            A future created by <code class="computeroutput"><span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span><span class="special">,</span> <span class="special">...)</span></code>
12022            or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span><span class="special">,</span> <span class="special">...)</span></code>
12023            has associated a launch policy <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>.
12024            A future created by <code class="computeroutput"><span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span><span class="special">,</span> <span class="special">...)</span></code>
12025            or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span><span class="special">,</span> <span class="special">...)</span></code>
12026            has associated a launch policy <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>.
12027            A future created by <code class="computeroutput"><span class="identifier">async</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">,</span> <span class="special">...)</span></code>
12028            or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">Executor</span><span class="special">,</span> <span class="special">...)</span></code>
12029            or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">executor</span><span class="special">,</span> <span class="special">...)</span></code>
12030            has associated a launch policy <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">executor</span></code>.
12031            A future created by <code class="computeroutput"><span class="identifier">async</span><span class="special">(...)</span></code> or <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(...)</span></code>
12032            has associated a launch policy <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">none</span></code>.
12033          </p>
12034<p>
12035            A future created by <code class="computeroutput"><span class="special">::</span><span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span><span class="special">::</span><span class="identifier">inherit</span><span class="special">,</span> <span class="special">...)</span></code>
12036            has associated a launch policy parent future.
12037          </p>
12038<p>
12039            The <code class="computeroutput"><span class="identifier">executor</span></code> and the
12040            <code class="computeroutput"><span class="identifier">inherit</span></code> launch policies
12041            have a sense only can be user only on <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code>.
12042          </p>
12043</div>
12044<div class="section">
12045<div class="titlepage"><div><div><h5 class="title">
12046<a name="thread.synchronization.futures.reference.is_error_code_enum"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.is_error_code_enum" title="Specialization is_error_code_enum&lt;future_errc&gt;">Specialization
12047          <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>
12048</h5></div></div></div>
12049<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
12050<span class="special">{</span>
12051  <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
12052  <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>
12053
12054<span class="special">}</span>
12055</pre>
12056</div>
12057<div class="section">
12058<div class="titlepage"><div><div><h5 class="title">
12059<a name="thread.synchronization.futures.reference.make_error_code"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_error_code" title="Non-member function make_error_code()">Non-member
12060          function <code class="computeroutput"><span class="identifier">make_error_code</span><span class="special">()</span></code></a>
12061</h5></div></div></div>
12062<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
12063<span class="special">{</span>
12064  <span class="identifier">error_code</span> <span class="identifier">make_error_code</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span>
12065<span class="special">}</span>
12066</pre>
12067<div class="variablelist">
12068<p class="title"><b></b></p>
12069<dl class="variablelist">
12070<dt><span class="term">Returns:</span></dt>
12071<dd><p>
12072                  <code class="computeroutput"><span class="identifier">error_code</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">e</span><span class="special">),</span>
12073                  <span class="identifier">future_category</span><span class="special">())</span></code>.
12074                </p></dd>
12075</dl>
12076</div>
12077</div>
12078<div class="section">
12079<div class="titlepage"><div><div><h5 class="title">
12080<a name="thread.synchronization.futures.reference.make_error_condition"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_error_condition" title="Non-member function make_error_condition()">Non-member
12081          function <code class="computeroutput"><span class="identifier">make_error_condition</span><span class="special">()</span></code></a>
12082</h5></div></div></div>
12083<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">system</span>
12084<span class="special">{</span>
12085  <span class="identifier">error_condition</span> <span class="identifier">make_error_condition</span><span class="special">(</span><span class="identifier">future_errc</span> <span class="identifier">e</span><span class="special">);</span>
12086<span class="special">}</span>
12087</pre>
12088<div class="variablelist">
12089<p class="title"><b></b></p>
12090<dl class="variablelist">
12091<dt><span class="term">Returns:</span></dt>
12092<dd><p>
12093                  <code class="computeroutput"><span class="identifier">error_condition</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&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>.
12094                </p></dd>
12095</dl>
12096</div>
12097</div>
12098<div class="section">
12099<div class="titlepage"><div><div><h5 class="title">
12100<a name="thread.synchronization.futures.reference.future_category"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_category" title="Non-member function future_category()">Non-member
12101          function <code class="computeroutput"><span class="identifier">future_category</span><span class="special">()</span></code></a>
12102</h5></div></div></div>
12103<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span><span class="special">&amp;</span> <span class="identifier">future_category</span><span class="special">();</span>
12104</pre>
12105<div class="variablelist">
12106<p class="title"><b></b></p>
12107<dl class="variablelist">
12108<dt><span class="term">Returns:</span></dt>
12109<dd><p>
12110                  A reference to an object of a type derived from class error_category.
12111                </p></dd>
12112<dt><span class="term">Notes:</span></dt>
12113<dd><p>
12114                  The object's <code class="computeroutput"><span class="identifier">default_error_condition</span></code>
12115                  and equivalent virtual functions behave as specified for the class
12116                  <code class="computeroutput"><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_category</span></code>. The object's
12117                  <code class="computeroutput"><span class="identifier">name</span></code> virtual function
12118                  returns a pointer to the string "future".
12119                </p></dd>
12120</dl>
12121</div>
12122</div>
12123<div class="section">
12124<div class="titlepage"><div><div><h5 class="title">
12125<a name="thread.synchronization.futures.reference.future_error"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error" title="Class future_error">Class
12126          <code class="computeroutput"><span class="identifier">future_error</span></code></a>
12127</h5></div></div></div>
12128<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">future_error</span>
12129    <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span>
12130<span class="special">{</span>
12131<span class="keyword">public</span><span class="special">:</span>
12132    <span class="identifier">future_error</span><span class="special">(</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">);</span>
12133
12134    <span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&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>
12135<span class="special">};</span>
12136</pre>
12137<div class="section">
12138<div class="titlepage"><div><div><h6 class="title">
12139<a name="thread.synchronization.futures.reference.future_error.constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.constructor" title="Constructor">Constructor</a>
12140</h6></div></div></div>
12141<pre class="programlisting"><span class="identifier">future_error</span><span class="special">(</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">);</span>
12142</pre>
12143<div class="variablelist">
12144<p class="title"><b></b></p>
12145<dl class="variablelist">
12146<dt><span class="term">Effects:</span></dt>
12147<dd><p>
12148                    Constructs a future_error.
12149                  </p></dd>
12150<dt><span class="term">Postconditions:</span></dt>
12151<dd><p>
12152                    <code class="computeroutput"><span class="identifier">code</span><span class="special">()==</span><span class="identifier">ec</span></code>
12153                  </p></dd>
12154<dt><span class="term">Throws:</span></dt>
12155<dd><p>
12156                    Nothing.
12157                  </p></dd>
12158</dl>
12159</div>
12160</div>
12161<div class="section">
12162<div class="titlepage"><div><div><h6 class="title">
12163<a name="thread.synchronization.futures.reference.future_error.code"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.code" title="Member function code()">Member
12164            function <code class="computeroutput"><span class="identifier">code</span><span class="special">()</span></code></a>
12165</h6></div></div></div>
12166<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&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>
12167</pre>
12168<div class="variablelist">
12169<p class="title"><b></b></p>
12170<dl class="variablelist">
12171<dt><span class="term">Returns:</span></dt>
12172<dd><p>
12173                    The value of <code class="computeroutput"><span class="identifier">ec</span></code>
12174                    that was passed to the object's constructor.
12175                  </p></dd>
12176</dl>
12177</div>
12178</div>
12179</div>
12180<div class="section">
12181<div class="titlepage"><div><div><h5 class="title">
12182<a name="thread.synchronization.futures.reference.future_status"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_status" title="Enumeration future_status">Enumeration
12183          <code class="computeroutput"><span class="identifier">future_status</span></code></a>
12184</h5></div></div></div>
12185<pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">future_status</span> <span class="special">{</span>
12186  <span class="identifier">ready</span><span class="special">,</span>  <span class="identifier">timeout</span><span class="special">,</span> <span class="identifier">deferred</span>
12187<span class="special">};</span>
12188</pre>
12189</div>
12190<div class="section">
12191<div class="titlepage"><div><div><h5 class="title">
12192<a name="thread.synchronization.futures.reference.future_error0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error0" title="Class exceptional_ptr EXPERIMENTAL">Class
12193          <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> EXPERIMENTAL</a>
12194</h5></div></div></div>
12195<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">exceptional_ptr</span>
12196<span class="special">{</span>
12197<span class="keyword">public</span><span class="special">:</span>
12198  <span class="identifier">exceptional_ptr</span><span class="special">();</span>
12199  <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span>
12200  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">&gt;</span>
12201  <span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">E</span><span class="special">&amp;&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
12202<span class="special">};</span>
12203</pre>
12204<div class="section">
12205<div class="titlepage"><div><div><h6 class="title">
12206<a name="thread.synchronization.futures.reference.future_error.constructor0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_error.constructor0" title="Constructor">Constructor</a>
12207</h6></div></div></div>
12208<pre class="programlisting"><span class="identifier">exceptional_ptr</span><span class="special">();</span>
12209<span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span>
12210<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">&gt;</span>
12211<span class="keyword">explicit</span> <span class="identifier">exceptional_ptr</span><span class="special">(</span><span class="identifier">E</span><span class="special">&amp;&amp;</span> <span class="identifier">ex</span><span class="special">);</span>
12212</pre>
12213<div class="variablelist">
12214<p class="title"><b></b></p>
12215<dl class="variablelist">
12216<dt><span class="term">Effects:</span></dt>
12217<dd><p>
12218                    The exception that is passed in to the constructor or the current
12219                    exception if no parameter is moved into the constructed <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code> if it is an
12220                    rvalue. Otherwise the exception is copied into the constructed
12221                    <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>.
12222                  </p></dd>
12223<dt><span class="term">Postconditions:</span></dt>
12224<dd><p>
12225                    <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
12226                    <span class="special">==</span> <span class="keyword">true</span>
12227                    <span class="special">&amp;&amp;</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="special">=</span>
12228                    <span class="keyword">true</span> <span class="special">&amp;&amp;</span>
12229                    <span class="identifier">has_value</span><span class="special">()</span>
12230                    <span class="special">=</span> <span class="keyword">false</span></code>
12231                  </p></dd>
12232<dt><span class="term">Throws:</span></dt>
12233<dd><p>
12234                    Nothing.
12235                  </p></dd>
12236</dl>
12237</div>
12238</div>
12239</div>
12240<div class="section">
12241<div class="titlepage"><div><div><h5 class="title">
12242<a name="thread.synchronization.futures.reference.unique_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code> class template</a>
12243</h5></div></div></div>
12244<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
12245<span class="keyword">class</span>  <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>
12246<span class="special">{</span>
12247
12248<span class="keyword">public</span><span class="special">:</span>
12249  <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span>  <span class="comment">// EXTENSION</span>
12250   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
12251   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12252
12253   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
12254  <span class="special">~</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span>
12255
12256  <span class="comment">// move support</span>
12257   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12258  <span class="keyword">explicit</span>  <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12259   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12260
12261  <span class="comment">// factories</span>
12262  <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>
12263
12264  <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>
12265   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12266  <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>
12267  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Ex</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
12268   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12269  <span class="identifier">then</span><span class="special">(</span><span class="identifier">Ex</span><span class="special">&amp;</span> <span class="identifier">executor</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>
12270  <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>
12271   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12272  <span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
12273
12274  <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">unwrap</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
12275   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="identifier">fallback_to</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
12276
12277  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
12278
12279  <span class="comment">// retrieving the value</span>
12280  <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get</span><span class="special">();</span>
12281  <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
12282
12283  <span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
12284
12285  <span class="comment">// functions to check state</span>
12286  <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
12287  <span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12288  <span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12289  <span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
12290
12291  <span class="comment">// waiting for the result to be ready</span>
12292  <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
12293  <span class="keyword">template</span> <span class="special">&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>
12294  <span class="identifier">future_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
12295  <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>
12296  <span class="identifier">future_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
12297
12298<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATE_TIME</span>
12299  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
12300  <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&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>
12301  <span class="keyword">bool</span> <span class="identifier">timed_wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&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>
12302<span class="preprocessor">#endif</span>
12303  <span class="keyword">typedef</span> <span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">state</span><span class="special">;</span>  <span class="comment">// EXTENSION</span>
12304  <span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>  <span class="comment">// EXTENSION</span>
12305<span class="special">};</span>
12306</pre>
12307<div class="section">
12308<div class="titlepage"><div><div><h6 class="title">
12309<a name="thread.synchronization.futures.reference.unique_future.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.default_constructor" title="Default Constructor">Default
12310            Constructor</a>
12311</h6></div></div></div>
12312<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span>
12313</pre>
12314<div class="variablelist">
12315<p class="title"><b></b></p>
12316<dl class="variablelist">
12317<dt><span class="term">Effects:</span></dt>
12318<dd><p>
12319                    Constructs an uninitialized <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>.
12320                  </p></dd>
12321<dt><span class="term">Postconditions:</span></dt>
12322<dd><p>
12323                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&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>
12324                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>.
12325                  </p></dd>
12326<dt><span class="term">Throws:</span></dt>
12327<dd><p>
12328                    Nothing.
12329                  </p></dd>
12330</dl>
12331</div>
12332</div>
12333<div class="section">
12334<div class="titlepage"><div><div><h6 class="title">
12335<a name="thread.synchronization.futures.reference.unique_future.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.destructor" title="Destructor">Destructor</a>
12336</h6></div></div></div>
12337<pre class="programlisting"><span class="special">~</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">();</span>
12338</pre>
12339<div class="variablelist">
12340<p class="title"><b></b></p>
12341<dl class="variablelist">
12342<dt><span class="term">Effects:</span></dt>
12343<dd><p>
12344                    Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
12345                  </p></dd>
12346<dt><span class="term">Throws:</span></dt>
12347<dd><p>
12348                    Nothing.
12349                  </p></dd>
12350</dl>
12351</div>
12352</div>
12353<div class="section">
12354<div class="titlepage"><div><div><h6 class="title">
12355<a name="thread.synchronization.futures.reference.unique_future.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.move_constructor" title="Move Constructor">Move
12356            Constructor</a>
12357</h6></div></div></div>
12358<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
12359</pre>
12360<div class="variablelist">
12361<p class="title"><b></b></p>
12362<dl class="variablelist">
12363<dt><span class="term">Effects:</span></dt>
12364<dd><p>
12365                    Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>, and transfers
12366                    ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code>
12367                    to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
12368                  </p></dd>
12369<dt><span class="term">Postconditions:</span></dt>
12370<dd><p>
12371                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12372                    returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-&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>
12373                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. If <code class="computeroutput"><span class="identifier">other</span></code> was associated with a
12374                    shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
12375                    <code class="computeroutput"><span class="identifier">other</span></code> is not
12376                    associated with any shared state.
12377                  </p></dd>
12378<dt><span class="term">Throws:</span></dt>
12379<dd><p>
12380                    Nothing.
12381                  </p></dd>
12382<dt><span class="term">Notes:</span></dt>
12383<dd><p>
12384                    If the compiler does not support rvalue-references, this is implemented
12385                    using the boost.thread move emulation.
12386                  </p></dd>
12387</dl>
12388</div>
12389</div>
12390<div class="section">
12391<div class="titlepage"><div><div><h6 class="title">
12392<a name="thread.synchronization.futures.reference.unique_future.unwrap_move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.unwrap_move_constructor" title="Unwrap Move Constructor - EXTENSION">Unwrap
12393            Move Constructor - EXTENSION</a>
12394</h6></div></div></div>
12395<pre class="programlisting"><span class="keyword">explicit</span>  <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12396</pre>
12397<div class="warning"><table border="0" summary="Warning">
12398<tr>
12399<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
12400<th align="left">Warning</th>
12401</tr>
12402<tr><td align="left" valign="top"><p>
12403                This constructor is experimental and subject to change in future
12404                versions. There are not too much tests yet, so it is possible that
12405                you can find out some trivial bugs :(
12406              </p></td></tr>
12407</table></div>
12408<div class="variablelist">
12409<p class="title"><b></b></p>
12410<dl class="variablelist">
12411<dt><span class="term">Requires:</span></dt>
12412<dd>
12413<p>
12414                    <code class="computeroutput"><span class="identifier">other</span><span class="special">.</span><span class="identifier">valid</span><span class="special">()</span></code>.
12415                  </p>
12416<p>
12417                    [Effects:
12418                  </p>
12419<p>
12420                    Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a>, and transfers
12421                    ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code>
12422                    and unwrapping the inner future (see <code class="computeroutput"><span class="identifier">unwrap</span><span class="special">()</span></code>).
12423                  </p>
12424</dd>
12425<dt><span class="term">Postconditions:</span></dt>
12426<dd><p>
12427                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12428                    returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-&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>
12429                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. The associated
12430                    shared state is now unwrapped and the inner future shared state
12431                    is associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. <code class="computeroutput"><span class="identifier">other</span></code>
12432                    is not associated with any shared state, <code class="computeroutput"><span class="special">!</span>
12433                    <span class="identifier">other</span><span class="special">.</span><span class="identifier">valid</span><span class="special">()</span></code>.
12434                  </p></dd>
12435<dt><span class="term">Throws:</span></dt>
12436<dd><p>
12437                    Nothing.
12438                  </p></dd>
12439<dt><span class="term">Notes:</span></dt>
12440<dd><p>
12441                    If the compiler does not support rvalue-references, this is implemented
12442                    using the boost.thread move emulation.
12443                  </p></dd>
12444</dl>
12445</div>
12446</div>
12447<div class="section">
12448<div class="titlepage"><div><div><h6 class="title">
12449<a name="thread.synchronization.futures.reference.unique_future.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.move_assignment" title="Move Assignment Operator">Move
12450            Assignment Operator</a>
12451</h6></div></div></div>
12452<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12453</pre>
12454<div class="variablelist">
12455<p class="title"><b></b></p>
12456<dl class="variablelist">
12457<dt><span class="term">Effects:</span></dt>
12458<dd><p>
12459                    Transfers ownership of the shared state associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
12460                  </p></dd>
12461<dt><span class="term">Postconditions:</span></dt>
12462<dd><p>
12463                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12464                    returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-&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>
12465                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>. If <code class="computeroutput"><span class="identifier">other</span></code> was associated with a
12466                    shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
12467                    <code class="computeroutput"><span class="identifier">other</span></code> is not
12468                    associated with any shared state. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was associated with an asynchronous
12469                    result prior to the call, that result no longer has an associated
12470                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> instance.
12471                  </p></dd>
12472<dt><span class="term">Throws:</span></dt>
12473<dd><p>
12474                    Nothing.
12475                  </p></dd>
12476<dt><span class="term">Notes:</span></dt>
12477<dd><p>
12478                    If the compiler does not support rvalue-references, this is implemented
12479                    using the boost.thread move emulation.
12480                  </p></dd>
12481</dl>
12482</div>
12483</div>
12484<div class="section">
12485<div class="titlepage"><div><div><h6 class="title">
12486<a name="thread.synchronization.futures.reference.unique_future.swap"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.swap" title="Member function swap()">Member
12487            function <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code></a>
12488</h6></div></div></div>
12489<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> <span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="identifier">no_except</span><span class="special">;</span>
12490</pre>
12491<div class="variablelist">
12492<p class="title"><b></b></p>
12493<dl class="variablelist">
12494<dt><span class="term">Effects:</span></dt>
12495<dd><p>
12496                    Swaps ownership of the shared states associated with <code class="computeroutput"><span class="identifier">other</span></code> and <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
12497                  </p></dd>
12498<dt><span class="term">Postconditions:</span></dt>
12499<dd><p>
12500                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12501                    returns the value of <code class="computeroutput"><span class="identifier">other</span><span class="special">-&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>
12502                    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
12503                    shared state, that result is now associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
12504                    otherwise <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12505                    has no associated result. If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was associated with a shared
12506                    state, that result is now associated with <code class="computeroutput"><span class="identifier">other</span></code>,
12507                    otherwise <code class="computeroutput"><span class="identifier">other</span></code>
12508                    has no associated result.
12509                  </p></dd>
12510<dt><span class="term">Throws:</span></dt>
12511<dd><p>
12512                    Nothing.
12513                  </p></dd>
12514</dl>
12515</div>
12516</div>
12517<div class="section">
12518<div class="titlepage"><div><div><h6 class="title">
12519<a name="thread.synchronization.futures.reference.unique_future.get"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get" title="Member function get()">Member
12520            function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a>
12521</h6></div></div></div>
12522<pre class="programlisting"><span class="identifier">R</span> <span class="identifier">get</span><span class="special">();</span>
12523<span class="identifier">R</span><span class="special">&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>
12524<span class="keyword">void</span>  <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">();</span>
12525</pre>
12526<div class="variablelist">
12527<p class="title"><b></b></p>
12528<dl class="variablelist">
12529<dt><span class="term">Effects:</span></dt>
12530<dd><p>
12531                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12532                    is associated with a shared state, waits until the result is
12533                    ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
12534                    and retrieves the result (whether that is a value or an exception).
12535                  </p></dd>
12536<dt><span class="term">Returns:</span></dt>
12537<dd>
12538<p>
12539                    - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&amp;&gt;::</span><span class="identifier">get</span><span class="special">()</span></code>
12540                    return the stored reference.
12541                  </p>
12542<p>
12543                    - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code>,
12544                    there is no return value.
12545                  </p>
12546<p>
12547                    - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">get</span><span class="special">()</span></code>
12548                    returns an rvalue-reference to the value stored in the shared
12549                    state.
12550                  </p>
12551</dd>
12552<dt><span class="term">Postconditions:</span></dt>
12553<dd><p>
12554                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12555                    returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12556                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12557                  </p></dd>
12558<dt><span class="term">Throws:</span></dt>
12559<dd>
12560<p>
12561                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12562                    is not associated with a shared state.
12563                  </p>
12564<p>
12565                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12566                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12567                    of the call, and the current thread is interrupted.
12568                  </p>
12569<p>
12570                    - Any exception stored in the shared state in place of a value.
12571                  </p>
12572</dd>
12573<dt><span class="term">Notes:</span></dt>
12574<dd><p>
12575                    <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
12576                    is an <span class="emphasis"><em>interruption point</em></span>.
12577                  </p></dd>
12578</dl>
12579</div>
12580</div>
12581<div class="section">
12582<div class="titlepage"><div><div><h6 class="title">
12583<a name="thread.synchronization.futures.reference.unique_future.get_or"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_or" title="Member function get_or() - EXTENSION">Member
12584            function <code class="computeroutput"><span class="identifier">get_or</span><span class="special">()</span></code>
12585            - EXTENSION</a>
12586</h6></div></div></div>
12587<pre class="programlisting"><span class="identifier">R</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span><span class="special">&amp;&amp;</span> <span class="identifier">v</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
12588<span class="identifier">R</span> <span class="identifier">get_or</span><span class="special">(</span><span class="identifier">R</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">v</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
12589<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>
12590<span class="keyword">void</span>  <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12591</pre>
12592<div class="warning"><table border="0" summary="Warning">
12593<tr>
12594<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
12595<th align="left">Warning</th>
12596</tr>
12597<tr><td align="left" valign="top"><p>
12598                These functions are experimental and subject to change in future
12599                versions. There are not too much tests yet, so it is possible that
12600                you can find out some trivial bugs :(
12601              </p></td></tr>
12602</table></div>
12603<div class="variablelist">
12604<p class="title"><b></b></p>
12605<dl class="variablelist">
12606<dt><span class="term">Effects:</span></dt>
12607<dd><p>
12608                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12609                    is associated with a shared state, waits until the result is
12610                    ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
12611                    and depending on whether the shared state <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> the retrieves the result.
12612                  </p></dd>
12613<dt><span class="term">Returns:</span></dt>
12614<dd>
12615<p>
12616                    - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12617                    return the stored reference if has_value() and the passes parameter
12618                    otherwise.
12619                  </p>
12620<p>
12621                    - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;::</span><span class="identifier">get_or</span><span class="special">()</span></code>,
12622                    there is no return value, but the function doesn't throws even
12623                    if the shared state contained an exception.
12624                  </p>
12625<p>
12626                    - <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
12627                    returns an rvalue-reference to the value stored in the shared
12628                    state if <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code> and an rvalue-reference build
12629                    with the parameter <code class="computeroutput"><span class="identifier">v</span></code>.
12630                  </p>
12631</dd>
12632<dt><span class="term">Postconditions:</span></dt>
12633<dd><p>
12634                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12635                    returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12636                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12637                  </p></dd>
12638<dt><span class="term">Throws:</span></dt>
12639<dd><p>
12640                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12641                    is not associated with a shared state.
12642                  </p></dd>
12643<dt><span class="term">Notes:</span></dt>
12644<dd><p>
12645                    <code class="computeroutput"><span class="identifier">get_or</span><span class="special">()</span></code>
12646                    is an <span class="emphasis"><em>interruption point</em></span>.
12647                  </p></dd>
12648</dl>
12649</div>
12650</div>
12651<div class="section">
12652<div class="titlepage"><div><div><h6 class="title">
12653<a name="thread.synchronization.futures.reference.unique_future.wait"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait" title="Member function wait()">Member
12654            function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
12655</h6></div></div></div>
12656<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
12657</pre>
12658<div class="variablelist">
12659<p class="title"><b></b></p>
12660<dl class="variablelist">
12661<dt><span class="term">Effects:</span></dt>
12662<dd><p>
12663                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12664                    is associated with a shared state, waits until the result is
12665                    ready. If the result is not ready on entry, and the result has
12666                    a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
12667                    prior to waiting.
12668                  </p></dd>
12669<dt><span class="term">Throws:</span></dt>
12670<dd>
12671<p>
12672                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12673                    is not associated with a shared state.
12674                  </p>
12675<p>
12676                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12677                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12678                    of the call, and the current thread is interrupted.
12679                  </p>
12680<p>
12681                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12682                    if such a callback is called.
12683                  </p>
12684</dd>
12685<dt><span class="term">Postconditions:</span></dt>
12686<dd><p>
12687                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12688                    returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12689                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12690                  </p></dd>
12691<dt><span class="term">Notes:</span></dt>
12692<dd><p>
12693                    <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
12694                    is an <span class="emphasis"><em>interruption point</em></span>.
12695                  </p></dd>
12696</dl>
12697</div>
12698</div>
12699<div class="section">
12700<div class="titlepage"><div><div><h6 class="title">
12701<a name="thread.synchronization.futures.reference.unique_future.timed_wait_duration"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.timed_wait_duration" title="Member function timed_wait() DEPRECATED SINCE V3.0.0">Member
12702            function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12703            DEPRECATED SINCE V3.0.0</a>
12704</h6></div></div></div>
12705<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
12706<span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">wait_duration</span><span class="special">);</span>
12707</pre>
12708<div class="warning"><table border="0" summary="Warning">
12709<tr>
12710<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
12711<th align="left">Warning</th>
12712</tr>
12713<tr><td align="left" valign="top">
12714<p>
12715                DEPRECATED since 3.00.
12716              </p>
12717<p>
12718                Use instead <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_for" title="template &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>.
12719              </p>
12720</td></tr>
12721</table></div>
12722<div class="variablelist">
12723<p class="title"><b></b></p>
12724<dl class="variablelist">
12725<dt><span class="term">Effects:</span></dt>
12726<dd><p>
12727                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12728                    is associated with a shared state, waits until the result is
12729                    ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
12730                    has elapsed. If the result is not ready on entry, and the result
12731                    has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12732                    invoked prior to waiting.
12733                  </p></dd>
12734<dt><span class="term">Returns:</span></dt>
12735<dd><p>
12736                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12737                    is associated with a shared state, and that result is ready before
12738                    the specified time has elapsed, <code class="computeroutput"><span class="keyword">false</span></code>
12739                    otherwise.
12740                  </p></dd>
12741<dt><span class="term">Throws:</span></dt>
12742<dd>
12743<p>
12744                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12745                    is not associated with a shared state.
12746                  </p>
12747<p>
12748                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12749                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12750                    of the call, and the current thread is interrupted.
12751                  </p>
12752<p>
12753                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12754                    if such a callback is called.
12755                  </p>
12756</dd>
12757<dt><span class="term">Postconditions:</span></dt>
12758<dd><p>
12759                    If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12760                    then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12761                    returns <code class="computeroutput"><span class="keyword">true</span></code> and
12762                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12763                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12764                  </p></dd>
12765<dt><span class="term">Notes:</span></dt>
12766<dd><p>
12767                    <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12768                    is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
12769                    meets the Boost.DateTime time duration requirements.
12770                  </p></dd>
12771</dl>
12772</div>
12773</div>
12774<div class="section">
12775<div class="titlepage"><div><div><h6 class="title">
12776<a name="thread.synchronization.futures.reference.unique_future.timed_wait_absolute"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.timed_wait_absolute" title="Member function timed_wait() DEPRECATED SINCE V3.0.0">Member
12777            function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12778            DEPRECATED SINCE V3.0.0</a>
12779</h6></div></div></div>
12780<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">wait_timeout</span><span class="special">);</span>
12781</pre>
12782<div class="warning"><table border="0" summary="Warning">
12783<tr>
12784<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
12785<th align="left">Warning</th>
12786</tr>
12787<tr><td align="left" valign="top">
12788<p>
12789                DEPRECATED since 3.00.
12790              </p>
12791<p>
12792                Use instead <a class="link" href="synchronization.html#thread.synchronization.condvar_ref.condition_variable.wait_until" title="template &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>.
12793              </p>
12794</td></tr>
12795</table></div>
12796<div class="variablelist">
12797<p class="title"><b></b></p>
12798<dl class="variablelist">
12799<dt><span class="term">Effects:</span></dt>
12800<dd><p>
12801                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12802                    is associated with a shared state, waits until the result is
12803                    ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
12804                    has passed. If the result is not ready on entry, and the result
12805                    has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12806                    invoked prior to waiting.
12807                  </p></dd>
12808<dt><span class="term">Returns:</span></dt>
12809<dd><p>
12810                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12811                    is associated with a shared state, and that result is ready before
12812                    the specified time has passed, <code class="computeroutput"><span class="keyword">false</span></code>
12813                    otherwise.
12814                  </p></dd>
12815<dt><span class="term">Throws:</span></dt>
12816<dd>
12817<p>
12818                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12819                    is not associated with a shared state.
12820                  </p>
12821<p>
12822                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12823                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12824                    of the call, and the current thread is interrupted.
12825                  </p>
12826<p>
12827                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12828                    if such a callback is called.
12829                  </p>
12830</dd>
12831<dt><span class="term">Postconditions:</span></dt>
12832<dd><p>
12833                    If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12834                    then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12835                    returns <code class="computeroutput"><span class="keyword">true</span></code> and
12836                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12837                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12838                  </p></dd>
12839<dt><span class="term">Notes:</span></dt>
12840<dd><p>
12841                    <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
12842                    is an <span class="emphasis"><em>interruption point</em></span>.
12843                  </p></dd>
12844</dl>
12845</div>
12846</div>
12847<div class="section">
12848<div class="titlepage"><div><div><h6 class="title">
12849<a name="thread.synchronization.futures.reference.unique_future.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait_for" title="Member function wait_for()">Member
12850            function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code></a>
12851</h6></div></div></div>
12852<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
12853<span class="identifier">future_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
12854</pre>
12855<div class="variablelist">
12856<p class="title"><b></b></p>
12857<dl class="variablelist">
12858<dt><span class="term">Effects:</span></dt>
12859<dd><p>
12860                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12861                    is associated with a shared state, waits until the result is
12862                    ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
12863                    has elapsed. If the result is not ready on entry, and the result
12864                    has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12865                    invoked prior to waiting.
12866                  </p></dd>
12867<dt><span class="term">Returns:</span></dt>
12868<dd>
12869<p>
12870                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12871                    if the shared state contains a deferred function. (Not implemented
12872                    yet)
12873                  </p>
12874<p>
12875                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12876                    if the shared state is ready.
12877                  </p>
12878<p>
12879                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12880                    if the function is returning because the relative timeout specified
12881                    by <code class="computeroutput"><span class="identifier">rel_time</span></code> has
12882                    expired.
12883                  </p>
12884</dd>
12885<dt><span class="term">Throws:</span></dt>
12886<dd>
12887<p>
12888                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12889                    is not associated with a shared state.
12890                  </p>
12891<p>
12892                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12893                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12894                    of the call, and the current thread is interrupted.
12895                  </p>
12896<p>
12897                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12898                    if such a callback is called.
12899                  </p>
12900</dd>
12901<dt><span class="term">Postconditions:</span></dt>
12902<dd><p>
12903                    If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12904                    then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12905                    returns <code class="computeroutput"><span class="keyword">true</span></code> and
12906                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12907                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12908                  </p></dd>
12909<dt><span class="term">Notes:</span></dt>
12910<dd><p>
12911                    <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code>
12912                    is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
12913                    meets the Boost.DateTime time duration requirements.
12914                  </p></dd>
12915</dl>
12916</div>
12917</div>
12918<div class="section">
12919<div class="titlepage"><div><div><h6 class="title">
12920<a name="thread.synchronization.futures.reference.unique_future.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.wait_until" title="Member function wait_until()">Member
12921            function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
12922</h6></div></div></div>
12923<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
12924<span class="identifier">future_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
12925</pre>
12926<div class="variablelist">
12927<p class="title"><b></b></p>
12928<dl class="variablelist">
12929<dt><span class="term">Effects:</span></dt>
12930<dd><p>
12931                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12932                    is associated with a shared state, waits until the result is
12933                    ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
12934                    has passed. If the result is not ready on entry, and the result
12935                    has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
12936                    invoked prior to waiting.
12937                  </p></dd>
12938<dt><span class="term">Returns:</span></dt>
12939<dd>
12940<p>
12941                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
12942                    if the shared state contains a deferred function. (Not implemented
12943                    yet)
12944                  </p>
12945<p>
12946                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
12947                    if the shared state is ready.
12948                  </p>
12949<p>
12950                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
12951                    if the function is returning because the absolute timeout specified
12952                    by <code class="computeroutput"><span class="identifier">absl_time</span></code>
12953                    has reached.
12954                  </p>
12955</dd>
12956<dt><span class="term">Throws:</span></dt>
12957<dd>
12958<p>
12959                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
12960                    is not associated with a shared state.
12961                  </p>
12962<p>
12963                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
12964                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
12965                    of the call, and the current thread is interrupted.
12966                  </p>
12967<p>
12968                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
12969                    if such a callback is called.
12970                  </p>
12971</dd>
12972<dt><span class="term">Postconditions:</span></dt>
12973<dd><p>
12974                    If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
12975                    then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
12976                    returns <code class="computeroutput"><span class="keyword">true</span></code> and
12977                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
12978                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
12979                  </p></dd>
12980<dt><span class="term">Notes:</span></dt>
12981<dd><p>
12982                    <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code>
12983                    is an <span class="emphasis"><em>interruption point</em></span>.
12984                  </p></dd>
12985</dl>
12986</div>
12987</div>
12988<div class="section">
12989<div class="titlepage"><div><div><h6 class="title">
12990<a name="thread.synchronization.futures.reference.unique_future.valid"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.valid" title="Member function valid()">Member
12991            function <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span></code></a>
12992</h6></div></div></div>
12993<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
12994</pre>
12995<div class="variablelist">
12996<p class="title"><b></b></p>
12997<dl class="variablelist">
12998<dt><span class="term">Returns:</span></dt>
12999<dd><p>
13000                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13001                    is associated with a shared state, <code class="computeroutput"><span class="keyword">false</span></code>
13002                    otherwise.
13003                  </p></dd>
13004<dt><span class="term">Remarks:</span></dt>
13005<dd><p>
13006                    The result of this function is not stable and that the future
13007                    could become invalid even if the function returned true or vice-versa.
13008                  </p></dd>
13009<dt><span class="term">Throws:</span></dt>
13010<dd><p>
13011                    Nothing.
13012                  </p></dd>
13013</dl>
13014</div>
13015</div>
13016<div class="section">
13017<div class="titlepage"><div><div><h6 class="title">
13018<a name="thread.synchronization.futures.reference.unique_future.is_ready"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.is_ready" title="Member function is_ready() EXTENSION">Member
13019            function <code class="computeroutput"><span class="identifier">is_ready</span><span class="special">()</span></code>
13020            EXTENSION</a>
13021</h6></div></div></div>
13022<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13023</pre>
13024<div class="variablelist">
13025<p class="title"><b></b></p>
13026<dl class="variablelist">
13027<dt><span class="term">Returns:</span></dt>
13028<dd><p>
13029                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13030                    is associated with a shared state and that result is ready for
13031                    retrieval, <code class="computeroutput"><span class="keyword">false</span></code>
13032                    otherwise.
13033                  </p></dd>
13034<dt><span class="term">Remarks:</span></dt>
13035<dd><p>
13036                    The result of this function is not stable and that the future
13037                    could become not ready even if the function returned true or
13038                    vice-versa.
13039                  </p></dd>
13040<dt><span class="term">Throws:</span></dt>
13041<dd><p>
13042                    Nothing.
13043                  </p></dd>
13044</dl>
13045</div>
13046</div>
13047<div class="section">
13048<div class="titlepage"><div><div><h6 class="title">
13049<a name="thread.synchronization.futures.reference.unique_future.has_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_value" title="Member function has_value() EXTENSION">Member
13050            function <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code>
13051            EXTENSION</a>
13052</h6></div></div></div>
13053<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13054</pre>
13055<div class="variablelist">
13056<p class="title"><b></b></p>
13057<dl class="variablelist">
13058<dt><span class="term">Returns:</span></dt>
13059<dd><p>
13060                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13061                    is associated with a shared state, that result is ready for retrieval,
13062                    and the result is a stored value, <code class="computeroutput"><span class="keyword">false</span></code>
13063                    otherwise.
13064                  </p></dd>
13065<dt><span class="term">Remarks:</span></dt>
13066<dd><p>
13067                    The result of this function is not stable and the future could
13068                    lost its value even if the function returned true or vice-versa.
13069                  </p></dd>
13070<dt><span class="term">Throws:</span></dt>
13071<dd><p>
13072                    Nothing.
13073                  </p></dd>
13074</dl>
13075</div>
13076</div>
13077<div class="section">
13078<div class="titlepage"><div><div><h6 class="title">
13079<a name="thread.synchronization.futures.reference.unique_future.has_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_exception" title="Member function has_exception() EXTENSION">Member
13080            function <code class="computeroutput"><span class="identifier">has_exception</span><span class="special">()</span></code> EXTENSION</a>
13081</h6></div></div></div>
13082<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13083</pre>
13084<div class="variablelist">
13085<p class="title"><b></b></p>
13086<dl class="variablelist">
13087<dt><span class="term">Returns:</span></dt>
13088<dd><p>
13089                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13090                    is associated with a shared state, that result is ready for retrieval,
13091                    and the result is a stored exception, <code class="computeroutput"><span class="keyword">false</span></code>
13092                    otherwise.
13093                  </p></dd>
13094<dt><span class="term">Remarks:</span></dt>
13095<dd><p>
13096                    The result of this function is not stable and the future could
13097                    lost its exception even if the function returned true or vice-versa.
13098                  </p></dd>
13099<dt><span class="term">Throws:</span></dt>
13100<dd><p>
13101                    Nothing.
13102                  </p></dd>
13103</dl>
13104</div>
13105</div>
13106<div class="section">
13107<div class="titlepage"><div><div><h6 class="title">
13108<a name="thread.synchronization.futures.reference.unique_future.get_exception_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_exception_ptr" title="Member function get_exception_ptr() EXTENSION">Member
13109            function <code class="computeroutput"><span class="identifier">get_exception_ptr</span><span class="special">()</span></code> EXTENSION</a>
13110</h6></div></div></div>
13111<pre class="programlisting"><span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span>
13112</pre>
13113<div class="variablelist">
13114<p class="title"><b></b></p>
13115<dl class="variablelist">
13116<dt><span class="term">Effects:</span></dt>
13117<dd><p>
13118                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13119                    is associated with a shared state, waits until the result is
13120                    ready. If the result is not ready on entry, and the result has
13121                    a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
13122                    prior to waiting.
13123                  </p></dd>
13124<dt><span class="term">Returns:</span></dt>
13125<dd><p>
13126                    an exception_ptr, storing or not an exception.
13127                  </p></dd>
13128<dt><span class="term">Remarks:</span></dt>
13129<dd><p>
13130                    The result of this function is not stable and the future could
13131                    lost its exception even if the function returned a valid <code class="computeroutput"><span class="identifier">exception_ptr</span></code> or vice-versa.
13132                  </p></dd>
13133<dt><span class="term">Throws:</span></dt>
13134<dd><p>
13135                    Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13136                  </p></dd>
13137</dl>
13138</div>
13139</div>
13140<div class="section">
13141<div class="titlepage"><div><div><h6 class="title">
13142<a name="thread.synchronization.futures.reference.unique_future.get_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.get_state" title="Member function get_state() EXTENSION">Member
13143            function <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code>
13144            EXTENSION</a>
13145</h6></div></div></div>
13146<pre class="programlisting"><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">();</span>
13147</pre>
13148<div class="variablelist">
13149<p class="title"><b></b></p>
13150<dl class="variablelist">
13151<dt><span class="term">Effects:</span></dt>
13152<dd><p>
13153                    Determine the state of the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
13154                    if any.
13155                  </p></dd>
13156<dt><span class="term">Returns:</span></dt>
13157<dd><p>
13158                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13159                    is not associated with a shared state. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a> if the shared
13160                    state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready for retrieval,
13161                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">waiting</span></code></a> otherwise.
13162                  </p></dd>
13163<dt><span class="term">Remarks:</span></dt>
13164<dd><p>
13165                    The result of this function is not stable.
13166                  </p></dd>
13167<dt><span class="term">Throws:</span></dt>
13168<dd><p>
13169                    Nothing.
13170                  </p></dd>
13171</dl>
13172</div>
13173</div>
13174<div class="section">
13175<div class="titlepage"><div><div><h6 class="title">
13176<a name="thread.synchronization.futures.reference.unique_future.share"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.share" title="Member function share()">Member
13177            function <code class="computeroutput"><span class="identifier">share</span><span class="special">()</span></code></a>
13178</h6></div></div></div>
13179<pre class="programlisting"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">share</span><span class="special">();</span>
13180</pre>
13181<div class="variablelist">
13182<p class="title"><b></b></p>
13183<dl class="variablelist">
13184<dt><span class="term">Returns:</span></dt>
13185<dd><p>
13186                    <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&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>.
13187                  </p></dd>
13188<dt><span class="term">Postconditions:</span></dt>
13189<dd><p>
13190                    <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">valid</span><span class="special">()</span>
13191                    <span class="special">==</span> <span class="keyword">false</span></code>.
13192                  </p></dd>
13193</dl>
13194</div>
13195</div>
13196<div class="section">
13197<div class="titlepage"><div><div><h6 class="title">
13198<a name="thread.synchronization.futures.reference.unique_future.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.then" title="Member function then() - EXTENSION">Member
13199            function <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code>
13200            - EXTENSION</a>
13201</h6></div></div></div>
13202<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
13203 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13204<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>
13205<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Ex</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
13206 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13207<span class="identifier">then</span><span class="special">(</span><span class="identifier">Ex</span><span class="special">&amp;</span> <span class="identifier">executor</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>
13208<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>
13209 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13210<span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">func</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
13211</pre>
13212<div class="warning"><table border="0" summary="Warning">
13213<tr>
13214<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
13215<th align="left">Warning</th>
13216</tr>
13217<tr><td align="left" valign="top"><p>
13218                These functions are experimental and subject to change in future
13219                versions. There are not too much tests yet, so it is possible that
13220                you can find out some trivial bugs :(
13221              </p></td></tr>
13222</table></div>
13223<div class="note"><table border="0" summary="Note">
13224<tr>
13225<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
13226<th align="left">Note</th>
13227</tr>
13228<tr><td align="left" valign="top"><p>
13229                These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future&lt;T&gt; and related
13230                APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
13231                H. Sutter, S. Mithani.
13232              </p></td></tr>
13233</table></div>
13234<div class="variablelist">
13235<p class="title"><b></b></p>
13236<dl class="variablelist">
13237<dt><span class="term">Notes:</span></dt>
13238<dd><p>
13239                    The three functions differ only by input parameters. The first
13240                    only takes a callable object which accepts a future object as
13241                    a parameter. The second function takes an executor as the first
13242                    parameter and a callable object as the second parameter. The
13243                    third function takes a launch policy as the first parameter and
13244                    a callable object as the second parameter.
13245                  </p></dd>
13246<dt><span class="term">Requires:</span></dt>
13247<dd><p>
13248                    <code class="computeroutput"><span class="identifier">INVOKE</span><span class="special">(</span><span class="identifier">DECAY_COPY</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">func</span><span class="special">)),</span>
13249                    <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span></code>
13250                    shall be a valid expression.
13251                  </p></dd>
13252<dt><span class="term">Effects:</span></dt>
13253<dd>
13254<p>
13255                    All the functions create a shared state that is associated with
13256                    the returned future object. Additionally,
13257                  </p>
13258<p>
13259                    - When the object's shared state is ready, the continuation
13260                    <code class="computeroutput"><span class="identifier">INVOKE</span><span class="special">(</span><span class="identifier">DECAY_COPY</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">func</span><span class="special">)),</span>
13261                    <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span></code>
13262                    is called depending on the overload (see below) with the call
13263                    to DECAY_COPY() being evaluated in the thread that called then.
13264                  </p>
13265<p>
13266                    - Any value returned from the continuation is stored as the result
13267                    in the shared state of the resulting <code class="computeroutput"><span class="identifier">future</span></code>.
13268                    Any exception propagated from the execution of the continuation
13269                    is stored as the exceptional result in the shared state of the
13270                    resulting <code class="computeroutput"><span class="identifier">future</span></code>.
13271                  </p>
13272<p>
13273                    The continuation launches according to the specified policy or
13274                    executor or noting.
13275                  </p>
13276<p>
13277                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">none</span></code>
13278                    the continuation is called on an unspecified thread of execution.
13279                  </p>
13280<p>
13281                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
13282                    the continuation is called on a new thread of execution.
13283                  </p>
13284<p>
13285                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
13286                    the continuation is called on demand.
13287                  </p>
13288<p>
13289                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">executor</span></code>
13290                    the continuation is called on one of the thread of execution
13291                    of the executor.
13292                  </p>
13293<p>
13294                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">inherit</span></code>
13295                    the continuation inherits the parent's launch policy or executor.
13296                  </p>
13297<p>
13298                    - When the executor or launch policy is not provided (first overload)
13299                    is if as if launch::none was specified.
13300                  </p>
13301<p>
13302                    - When the executor is provided (second overload) the continuation
13303                    is called on one of the thread of execution of the executor.
13304                  </p>
13305<p>
13306                    - If the parent has a policy of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
13307                    and the continuation does not have a specified launch policy
13308                    executor, then the parent is filled by immediately calling <code class="computeroutput"><span class="special">.</span><span class="identifier">wait</span><span class="special">()</span></code>, and the policy of the antecedent
13309                    is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>.
13310                  </p>
13311</dd>
13312<dt><span class="term">Returns:</span></dt>
13313<dd><p>
13314                    An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13315                    that refers to the shared state created by the continuation.
13316                  </p></dd>
13317<dt><span class="term">Notes:</span></dt>
13318<dd>
13319<p>
13320                    - Note that nested futures are not implicitly unwrapped yet.
13321                    This could be subject to change in future versions.
13322                  </p>
13323<p>
13324                    - The returned futures behave as the ones returned from boost::async,
13325                    the destructor of the future object returned from then will block.
13326                    This could be subject to change in future versions.
13327                  </p>
13328</dd>
13329<dt><span class="term">Postconditions:</span></dt>
13330<dd>
13331<p>
13332                    - The <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a></code> object
13333                    passed to the parameter of the continuation function is a copy
13334                    of the original <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a></code>.
13335                  </p>
13336<p>
13337                    - <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
13338                    <span class="special">==</span> <span class="keyword">false</span></code>
13339                    on original future; <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
13340                    <span class="keyword">true</span></code> on the <code class="computeroutput"><span class="identifier">future</span></code> returned from then.
13341                  </p>
13342</dd>
13343</dl>
13344</div>
13345</div>
13346<div class="section">
13347<div class="titlepage"><div><div><h6 class="title">
13348<a name="thread.synchronization.futures.reference.unique_future.unwrap"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.unwrap" title="Member function unwrap() EXTENSION">Member
13349            function <code class="computeroutput"><span class="identifier">unwrap</span><span class="special">()</span></code>
13350            EXTENSION</a>
13351</h6></div></div></div>
13352<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R2</span><span class="special">&gt;</span>
13353 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13354<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>
13355 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a><span class="special">&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>
13356</pre>
13357<div class="warning"><table border="0" summary="Warning">
13358<tr>
13359<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
13360<th align="left">Warning</th>
13361</tr>
13362<tr><td align="left" valign="top"><p>
13363                These functions are experimental and subject to change in future
13364                versions. There are not too much tests yet, so it is possible that
13365                you can find out some trivial bugs :(
13366              </p></td></tr>
13367</table></div>
13368<div class="note"><table border="0" summary="Note">
13369<tr>
13370<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
13371<th align="left">Note</th>
13372</tr>
13373<tr><td align="left" valign="top"><p>
13374                These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future&lt;T&gt; and related
13375                APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
13376                H. Sutter, S. Mithani.
13377              </p></td></tr>
13378</table></div>
13379<div class="variablelist">
13380<p class="title"><b></b></p>
13381<dl class="variablelist">
13382<dt><span class="term">Notes:</span></dt>
13383<dd><p>
13384                    Removes the outermost future and returns a future with the associated
13385                    state been a proxy of the outer future.
13386                  </p></dd>
13387<dt><span class="term">Effects:</span></dt>
13388<dd><p>
13389                    - Returns a future that becomes ready when the shared state of
13390                    the outer and inner future is ready. The validity of the future
13391                    returned from <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code> applied on the outer future
13392                    cannot be established a priori. If it is not valid, this future
13393                    is forced to be valid and becomes ready with an exception of
13394                    type <code class="computeroutput"><span class="identifier">future_error</span></code>,
13395                    with an error code of <code class="computeroutput"><span class="identifier">future_errc</span><span class="special">::</span><span class="identifier">broken_promise</span></code>.
13396                  </p></dd>
13397<dt><span class="term">Returns:</span></dt>
13398<dd><p>
13399                    An object of type future with the associated state been a proxy
13400                    of outer future.
13401                  </p></dd>
13402<dt><span class="term">Postconditions:</span></dt>
13403<dd><p>
13404                    - The returned future has <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
13405                    <span class="keyword">true</span></code>.
13406                  </p></dd>
13407</dl>
13408</div>
13409</div>
13410</div>
13411<div class="section">
13412<div class="titlepage"><div><div><h5 class="title">
13413<a name="thread.synchronization.futures.reference.shared_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">shared_future</span></code> class template</a>
13414</h5></div></div></div>
13415<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
13416<span class="keyword">class</span> <span class="identifier">shared_future</span>
13417<span class="special">{</span>
13418<span class="keyword">public</span><span class="special">:</span>
13419  <span class="keyword">typedef</span> <span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">state</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13420  <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span>  <span class="comment">// EXTENSION</span>
13421
13422  <span class="identifier">shared_future</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
13423  <span class="special">~</span><span class="identifier">shared_future</span><span class="special">();</span>
13424
13425  <span class="comment">// copy support</span>
13426  <span class="identifier">shared_future</span><span class="special">(</span><span class="identifier">shared_future</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
13427  <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>
13428
13429  <span class="comment">// move support</span>
13430  <span class="identifier">shared_future</span><span class="special">(</span><span class="identifier">shared_future</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
13431  <span class="identifier">shared_future</span><span class="special">(</span> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13432  <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>
13433  <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>
13434
13435  <span class="comment">// factories</span>
13436  <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>
13437   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13438  <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>
13439  <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>
13440   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13441  <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>
13442  <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>
13443   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
13444  <span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&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>
13445
13446  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">shared_future</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
13447
13448  <span class="comment">// retrieving the value</span>
13449  <span class="identifier">see</span> <span class="identifier">below</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13450
13451  <span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
13452
13453  <span class="comment">// functions to check state, and wait for ready</span>
13454  <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
13455  <span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13456  <span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13457  <span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span> <span class="comment">// EXTENSION</span>
13458
13459  <span class="comment">// waiting for the result to be ready</span>
13460  <span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13461  <span class="keyword">template</span> <span class="special">&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>
13462  <span class="identifier">future_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
13463  <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>
13464  <span class="identifier">future_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
13465
13466<span class="preprocessor">#if</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_USES_DATE_TIME</span> <span class="special">||</span> <span class="identifier">defined</span> <span class="identifier">BOOST_THREAD_DONT_USE_CHRONO</span>
13467  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
13468  <span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&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>
13469  <span class="keyword">bool</span> <span class="identifier">timed_wait_until</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&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>
13470<span class="preprocessor">#endif</span>
13471  <span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>  <span class="comment">// EXTENSION</span>
13472
13473<span class="special">};</span>
13474</pre>
13475<div class="section">
13476<div class="titlepage"><div><div><h6 class="title">
13477<a name="thread.synchronization.futures.reference.shared_future.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.default_constructor" title="Default Constructor">Default
13478            Constructor</a>
13479</h6></div></div></div>
13480<pre class="programlisting"><span class="identifier">shared_future</span><span class="special">();</span>
13481</pre>
13482<div class="variablelist">
13483<p class="title"><b></b></p>
13484<dl class="variablelist">
13485<dt><span class="term">Effects:</span></dt>
13486<dd><p>
13487                    Constructs an uninitialized shared_future.
13488                  </p></dd>
13489<dt><span class="term">Postconditions:</span></dt>
13490<dd><p>
13491                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&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>
13492                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a>.
13493                  </p></dd>
13494<dt><span class="term">Throws:</span></dt>
13495<dd><p>
13496                    Nothing.
13497                  </p></dd>
13498</dl>
13499</div>
13500</div>
13501<div class="section">
13502<div class="titlepage"><div><div><h6 class="title">
13503<a name="thread.synchronization.futures.reference.shared_future.get"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get" title="Member function get()">Member
13504            function <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code></a>
13505</h6></div></div></div>
13506<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13507<span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13508<span class="keyword">void</span> <span class="identifier">get</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13509</pre>
13510<div class="variablelist">
13511<p class="title"><b></b></p>
13512<dl class="variablelist">
13513<dt><span class="term">Effects:</span></dt>
13514<dd><p>
13515                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13516                    is associated with a shared state, waits until the result is
13517                    ready as-if by a call to <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait" title="Member function wait()"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">wait</span><span class="special">()</span></code></a>,
13518                    and returns a <code class="computeroutput"><span class="keyword">const</span></code>
13519                    reference to the result.
13520                  </p></dd>
13521<dt><span class="term">Returns:</span></dt>
13522<dd>
13523<p>
13524                    - <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&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.
13525                  </p>
13526<p>
13527                    - <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.
13528                  </p>
13529<p>
13530                    - <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>
13531                    reference to the value stored in the shared state.
13532                  </p>
13533</dd>
13534<dt><span class="term">Throws:</span></dt>
13535<dd>
13536<p>
13537                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13538                    is not associated with a shared state.
13539                  </p>
13540<p>
13541                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
13542                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
13543                    of the call, and the current thread is interrupted.
13544                  </p>
13545</dd>
13546<dt><span class="term">Notes:</span></dt>
13547<dd><p>
13548                    <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>
13549                    is an <span class="emphasis"><em>interruption point</em></span>.
13550                  </p></dd>
13551</dl>
13552</div>
13553</div>
13554<div class="section">
13555<div class="titlepage"><div><div><h6 class="title">
13556<a name="thread.synchronization.futures.reference.shared_future.wait"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait" title="Member function wait()">Member
13557            function <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code></a>
13558</h6></div></div></div>
13559<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13560</pre>
13561<div class="variablelist">
13562<p class="title"><b></b></p>
13563<dl class="variablelist">
13564<dt><span class="term">Effects:</span></dt>
13565<dd><p>
13566                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13567                    is associated with a shared state, waits until the result is
13568                    ready. If the result is not ready on entry, and the result has
13569                    a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
13570                    prior to waiting.
13571                  </p></dd>
13572<dt><span class="term">Throws:</span></dt>
13573<dd>
13574<p>
13575                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13576                    is not associated with a shared state.
13577                  </p>
13578<p>
13579                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
13580                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
13581                    of the call, and the current thread is interrupted.
13582                  </p>
13583<p>
13584                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
13585                    if such a callback is called.
13586                  </p>
13587</dd>
13588<dt><span class="term">Postconditions:</span></dt>
13589<dd><p>
13590                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
13591                    returns <code class="computeroutput"><span class="keyword">true</span></code>. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
13592                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
13593                  </p></dd>
13594<dt><span class="term">Notes:</span></dt>
13595<dd><p>
13596                    <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code>
13597                    is an <span class="emphasis"><em>interruption point</em></span>.
13598                  </p></dd>
13599</dl>
13600</div>
13601</div>
13602<div class="section">
13603<div class="titlepage"><div><div><h6 class="title">
13604<a name="thread.synchronization.futures.reference.shared_future.timed_wait_duration"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.timed_wait_duration" title="Member function timed_wait()">Member
13605            function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code></a>
13606</h6></div></div></div>
13607<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Duration</span><span class="special">&gt;</span>
13608<span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">Duration</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">wait_duration</span><span class="special">);</span>
13609</pre>
13610<div class="variablelist">
13611<p class="title"><b></b></p>
13612<dl class="variablelist">
13613<dt><span class="term">Effects:</span></dt>
13614<dd><p>
13615                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13616                    is associated with a shared state, waits until the result is
13617                    ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
13618                    has elapsed. If the result is not ready on entry, and the result
13619                    has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
13620                    invoked prior to waiting.
13621                  </p></dd>
13622<dt><span class="term">Returns:</span></dt>
13623<dd><p>
13624                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13625                    is associated with a shared state, and that result is ready before
13626                    the specified time has elapsed, <code class="computeroutput"><span class="keyword">false</span></code>
13627                    otherwise.
13628                  </p></dd>
13629<dt><span class="term">Throws:</span></dt>
13630<dd>
13631<p>
13632                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13633                    is not associated with a shared state.
13634                  </p>
13635<p>
13636                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
13637                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
13638                    of the call, and the current thread is interrupted.
13639                  </p>
13640<p>
13641                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
13642                    if such a callback is called.
13643                  </p>
13644</dd>
13645<dt><span class="term">Postconditions:</span></dt>
13646<dd><p>
13647                    If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
13648                    then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
13649                    returns <code class="computeroutput"><span class="keyword">true</span></code> and
13650                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
13651                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
13652                  </p></dd>
13653<dt><span class="term">Notes:</span></dt>
13654<dd><p>
13655                    <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
13656                    is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
13657                    meets the Boost.DateTime time duration requirements.
13658                  </p></dd>
13659</dl>
13660</div>
13661</div>
13662<div class="section">
13663<div class="titlepage"><div><div><h6 class="title">
13664<a name="thread.synchronization.futures.reference.shared_future.timed_wait_absolute"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.timed_wait_absolute" title="Member function timed_wait()">Member
13665            function <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code></a>
13666</h6></div></div></div>
13667<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">timed_wait</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system_time</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">wait_timeout</span><span class="special">);</span>
13668</pre>
13669<div class="variablelist">
13670<p class="title"><b></b></p>
13671<dl class="variablelist">
13672<dt><span class="term">Effects:</span></dt>
13673<dd><p>
13674                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13675                    is associated with a shared state, waits until the result is
13676                    ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
13677                    has passed. If the result is not ready on entry, and the result
13678                    has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
13679                    invoked prior to waiting.
13680                  </p></dd>
13681<dt><span class="term">Returns:</span></dt>
13682<dd><p>
13683                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13684                    is associated with a shared state, and that result is ready before
13685                    the specified time has passed, <code class="computeroutput"><span class="keyword">false</span></code>
13686                    otherwise.
13687                  </p></dd>
13688<dt><span class="term">Throws:</span></dt>
13689<dd>
13690<p>
13691                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13692                    is not associated with a shared state.
13693                  </p>
13694<p>
13695                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
13696                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
13697                    of the call, and the current thread is interrupted.
13698                  </p>
13699<p>
13700                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
13701                    if such a callback is called.
13702                  </p>
13703</dd>
13704<dt><span class="term">Postconditions:</span></dt>
13705<dd><p>
13706                    If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
13707                    then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
13708                    returns <code class="computeroutput"><span class="keyword">true</span></code> and
13709                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
13710                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
13711                  </p></dd>
13712<dt><span class="term">Notes:</span></dt>
13713<dd><p>
13714                    <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
13715                    is an <span class="emphasis"><em>interruption point</em></span>.
13716                  </p></dd>
13717</dl>
13718</div>
13719</div>
13720<div class="section">
13721<div class="titlepage"><div><div><h6 class="title">
13722<a name="thread.synchronization.futures.reference.shared_future.wait_for"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait_for" title="Member function wait_for()">Member
13723            function <code class="computeroutput"><span class="identifier">wait_for</span><span class="special">()</span></code></a>
13724</h6></div></div></div>
13725<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
13726<span class="identifier">future_status</span> <span class="identifier">wait_for</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&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>
13727</pre>
13728<div class="variablelist">
13729<p class="title"><b></b></p>
13730<dl class="variablelist">
13731<dt><span class="term">Effects:</span></dt>
13732<dd><p>
13733                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13734                    is associated with a shared state, waits until the result is
13735                    ready, or the time specified by <code class="computeroutput"><span class="identifier">wait_duration</span></code>
13736                    has elapsed. If the result is not ready on entry, and the result
13737                    has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
13738                    invoked prior to waiting.
13739                  </p></dd>
13740<dt><span class="term">Returns:</span></dt>
13741<dd>
13742<p>
13743                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
13744                    if the shared state contains a deferred function. (Not implemented
13745                    yet)
13746                  </p>
13747<p>
13748                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
13749                    if the shared state is ready.
13750                  </p>
13751<p>
13752                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
13753                    if the function is returning because the relative timeout specified
13754                    by <code class="computeroutput"><span class="identifier">rel_time</span></code> has
13755                    expired.
13756                  </p>
13757</dd>
13758<dt><span class="term">Throws:</span></dt>
13759<dd>
13760<p>
13761                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13762                    is not associated with a shared state.
13763                  </p>
13764<p>
13765                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
13766                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
13767                    of the call, and the current thread is interrupted.
13768                  </p>
13769<p>
13770                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
13771                    if such a callback is called.
13772                  </p>
13773</dd>
13774<dt><span class="term">Postconditions:</span></dt>
13775<dd><p>
13776                    If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
13777                    then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
13778                    returns <code class="computeroutput"><span class="keyword">true</span></code> and
13779                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
13780                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
13781                  </p></dd>
13782<dt><span class="term">Notes:</span></dt>
13783<dd><p>
13784                    <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
13785                    is an <span class="emphasis"><em>interruption point</em></span>. <code class="computeroutput"><span class="identifier">Duration</span></code> must be a type that
13786                    meets the Boost.DateTime time duration requirements.
13787                  </p></dd>
13788</dl>
13789</div>
13790</div>
13791<div class="section">
13792<div class="titlepage"><div><div><h6 class="title">
13793<a name="thread.synchronization.futures.reference.shared_future.wait_until"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.wait_until" title="Member function wait_until()">Member
13794            function <code class="computeroutput"><span class="identifier">wait_until</span><span class="special">()</span></code></a>
13795</h6></div></div></div>
13796<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
13797<span class="identifier">future_status</span> <span class="identifier">wait_until</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&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>
13798</pre>
13799<div class="variablelist">
13800<p class="title"><b></b></p>
13801<dl class="variablelist">
13802<dt><span class="term">Effects:</span></dt>
13803<dd><p>
13804                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13805                    is associated with a shared state, waits until the result is
13806                    ready, or the time point specified by <code class="computeroutput"><span class="identifier">wait_timeout</span></code>
13807                    has passed. If the result is not ready on entry, and the result
13808                    has a <span class="emphasis"><em>wait callback</em></span> set, that callback is
13809                    invoked prior to waiting.
13810                  </p></dd>
13811<dt><span class="term">Returns:</span></dt>
13812<dd>
13813<p>
13814                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">deferred</span></code>
13815                    if the shared state contains a deferred function. (Not implemented
13816                    yet)
13817                  </p>
13818<p>
13819                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">ready</span></code>
13820                    if the shared state is ready.
13821                  </p>
13822<p>
13823                    - <code class="computeroutput"><span class="identifier">future_status</span><span class="special">::</span><span class="identifier">timeout</span></code>
13824                    if the function is returning because the absolute timeout specified
13825                    by <code class="computeroutput"><span class="identifier">absl_time</span></code>
13826                    has reached.
13827                  </p>
13828</dd>
13829<dt><span class="term">Throws:</span></dt>
13830<dd>
13831<p>
13832                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_uninitialized</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13833                    is not associated with a shared state.
13834                  </p>
13835<p>
13836                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the result
13837                    associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is not ready at the point
13838                    of the call, and the current thread is interrupted.
13839                  </p>
13840<p>
13841                    - Any exception thrown by the <span class="emphasis"><em>wait callback</em></span>
13842                    if such a callback is called.
13843                  </p>
13844</dd>
13845<dt><span class="term">Postconditions:</span></dt>
13846<dd><p>
13847                    If this call returned <code class="computeroutput"><span class="keyword">true</span></code>,
13848                    then <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_ready</span><span class="special">()</span></code></a>
13849                    returns <code class="computeroutput"><span class="keyword">true</span></code> and
13850                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION"><code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_state</span><span class="special">()</span></code></a>
13851                    returns <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a>.
13852                  </p></dd>
13853<dt><span class="term">Notes:</span></dt>
13854<dd><p>
13855                    <code class="computeroutput"><span class="identifier">timed_wait</span><span class="special">()</span></code>
13856                    is an <span class="emphasis"><em>interruption point</em></span>.
13857                  </p></dd>
13858</dl>
13859</div>
13860</div>
13861<div class="section">
13862<div class="titlepage"><div><div><h6 class="title">
13863<a name="thread.synchronization.futures.reference.shared_future.valid"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.valid" title="Member function valid()">Member
13864            function <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span></code></a>
13865</h6></div></div></div>
13866<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
13867</pre>
13868<div class="variablelist">
13869<p class="title"><b></b></p>
13870<dl class="variablelist">
13871<dt><span class="term">Returns:</span></dt>
13872<dd><p>
13873                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13874                    is associated with a shared state, <code class="computeroutput"><span class="keyword">false</span></code>
13875                    otherwise.
13876                  </p></dd>
13877<dt><span class="term">Throws:</span></dt>
13878<dd><p>
13879                    Nothing.
13880                  </p></dd>
13881</dl>
13882</div>
13883</div>
13884<div class="section">
13885<div class="titlepage"><div><div><h6 class="title">
13886<a name="thread.synchronization.futures.reference.shared_future.is_ready"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.is_ready" title="Member function is_ready() EXTENSION">Member
13887            function <code class="computeroutput"><span class="identifier">is_ready</span><span class="special">()</span></code>
13888            EXTENSION</a>
13889</h6></div></div></div>
13890<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_ready</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13891</pre>
13892<div class="variablelist">
13893<p class="title"><b></b></p>
13894<dl class="variablelist">
13895<dt><span class="term">Returns:</span></dt>
13896<dd><p>
13897                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13898                    is associated with a shared state, and that result is ready for
13899                    retrieval, <code class="computeroutput"><span class="keyword">false</span></code>
13900                    otherwise.
13901                  </p></dd>
13902<dt><span class="term">Throws:</span></dt>
13903<dd><p>
13904                    Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13905                  </p></dd>
13906</dl>
13907</div>
13908</div>
13909<div class="section">
13910<div class="titlepage"><div><div><h6 class="title">
13911<a name="thread.synchronization.futures.reference.shared_future.has_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_value" title="Member function has_value() EXTENSION">Member
13912            function <code class="computeroutput"><span class="identifier">has_value</span><span class="special">()</span></code>
13913            EXTENSION</a>
13914</h6></div></div></div>
13915<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_value</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13916</pre>
13917<div class="variablelist">
13918<p class="title"><b></b></p>
13919<dl class="variablelist">
13920<dt><span class="term">Returns:</span></dt>
13921<dd><p>
13922                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13923                    is associated with a shared state, that result is ready for retrieval,
13924                    and the result is a stored value, <code class="computeroutput"><span class="keyword">false</span></code>
13925                    otherwise.
13926                  </p></dd>
13927<dt><span class="term">Throws:</span></dt>
13928<dd><p>
13929                    Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13930                  </p></dd>
13931</dl>
13932</div>
13933</div>
13934<div class="section">
13935<div class="titlepage"><div><div><h6 class="title">
13936<a name="thread.synchronization.futures.reference.shared_future.has_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_exception" title="Member function has_exception() EXTENSION">Member
13937            function <code class="computeroutput"><span class="identifier">has_exception</span><span class="special">()</span></code> EXTENSION</a>
13938</h6></div></div></div>
13939<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">has_exception</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
13940</pre>
13941<div class="variablelist">
13942<p class="title"><b></b></p>
13943<dl class="variablelist">
13944<dt><span class="term">Returns:</span></dt>
13945<dd><p>
13946                    <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13947                    is associated with a shared state, that result is ready for retrieval,
13948                    and the result is a stored exception, <code class="computeroutput"><span class="keyword">false</span></code>
13949                    otherwise.
13950                  </p></dd>
13951<dt><span class="term">Throws:</span></dt>
13952<dd><p>
13953                    Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13954                  </p></dd>
13955</dl>
13956</div>
13957</div>
13958<div class="section">
13959<div class="titlepage"><div><div><h6 class="title">
13960<a name="thread.synchronization.futures.reference.shared_future.get_exception_ptr"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_exception_ptr" title="Member function get_exception_ptr() EXTENSION">Member
13961            function <code class="computeroutput"><span class="identifier">get_exception_ptr</span><span class="special">()</span></code> EXTENSION</a>
13962</h6></div></div></div>
13963<pre class="programlisting"><span class="identifier">exception_ptr</span> <span class="identifier">get_exception_ptr</span><span class="special">();</span>
13964</pre>
13965<div class="variablelist">
13966<p class="title"><b></b></p>
13967<dl class="variablelist">
13968<dt><span class="term">Effects:</span></dt>
13969<dd><p>
13970                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
13971                    is associated with a shared state, waits until the result is
13972                    ready. If the result is not ready on entry, and the result has
13973                    a <span class="emphasis"><em>wait callback</em></span> set, that callback is invoked
13974                    prior to waiting.
13975                  </p></dd>
13976<dt><span class="term">Returns:</span></dt>
13977<dd><p>
13978                    an exception_ptr, storing or not an exception.
13979                  </p></dd>
13980<dt><span class="term">Throws:</span></dt>
13981<dd><p>
13982                    Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
13983                  </p></dd>
13984</dl>
13985</div>
13986</div>
13987<div class="section">
13988<div class="titlepage"><div><div><h6 class="title">
13989<a name="thread.synchronization.futures.reference.shared_future.get_state"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.get_state" title="Member function get_state() EXTENSION">Member
13990            function <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code>
13991            EXTENSION</a>
13992</h6></div></div></div>
13993<pre class="programlisting"><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">();</span>
13994</pre>
13995<div class="variablelist">
13996<p class="title"><b></b></p>
13997<dl class="variablelist">
13998<dt><span class="term">Effects:</span></dt>
13999<dd><p>
14000                    Determine the state of the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
14001                    if any.
14002                  </p></dd>
14003<dt><span class="term">Returns:</span></dt>
14004<dd><p>
14005                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">uninitialized</span></code></a> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14006                    is not associated with a shared state. <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">ready</span></code></a> if the shared
14007                    state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready for retrieval,
14008                    <a class="link" href="synchronization.html#thread.synchronization.futures.reference.future_state" title="Enumeration state"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_state</span><span class="special">::</span><span class="identifier">waiting</span></code></a> otherwise.
14009                  </p></dd>
14010<dt><span class="term">Throws:</span></dt>
14011<dd><p>
14012                    Whatever <code class="computeroutput"><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">lock</span><span class="special">()/</span><span class="identifier">mutex</span><span class="special">::</span><span class="identifier">unlock</span><span class="special">()</span></code> can throw.
14013                  </p></dd>
14014</dl>
14015</div>
14016</div>
14017<div class="section">
14018<div class="titlepage"><div><div><h6 class="title">
14019<a name="thread.synchronization.futures.reference.shared_future.then"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.then" title="Member function then() EXTENSION">Member
14020            function <code class="computeroutput"><span class="identifier">then</span><span class="special">()</span></code>
14021            EXTENSION</a>
14022</h6></div></div></div>
14023<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
14024 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
14025<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>
14026<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Ex</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
14027 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
14028<span class="identifier">then</span><span class="special">(</span><span class="identifier">Ex</span><span class="special">&amp;</span> <span class="identifier">executor</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>
14029<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>
14030 <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
14031<span class="identifier">then</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&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>
14032</pre>
14033<div class="warning"><table border="0" summary="Warning">
14034<tr>
14035<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
14036<th align="left">Warning</th>
14037</tr>
14038<tr><td align="left" valign="top"><p>
14039                These functions are experimental and subject to change in future
14040                versions. There are not too much tests yet, so it is possible that
14041                you can find out some trivial bugs :(
14042              </p></td></tr>
14043</table></div>
14044<div class="note"><table border="0" summary="Note">
14045<tr>
14046<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
14047<th align="left">Note</th>
14048</tr>
14049<tr><td align="left" valign="top"><p>
14050                These functions are based on the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf" target="_top"><span class="bold"><strong>N3634 - Improvements to std::future&lt;T&gt; and related
14051                APIs</strong></span></a> C++1y proposal by N. Gustafsson, A. Laksberg,
14052                H. Sutter, S. Mithani.
14053              </p></td></tr>
14054</table></div>
14055<div class="variablelist">
14056<p class="title"><b></b></p>
14057<dl class="variablelist">
14058<dt><span class="term">Notes:</span></dt>
14059<dd><p>
14060                    The three functions differ only by input parameters. The first
14061                    only takes a callable object which accepts a shared_future object
14062                    as a parameter. The second function takes an executor as the
14063                    first parameter and a callable object as the second parameter.
14064                    The third function takes a launch policy as the first parameter
14065                    and a callable object as the second parameter.
14066                  </p></dd>
14067<dt><span class="term">Requires:</span></dt>
14068<dd><p>
14069                    <code class="computeroutput"><span class="identifier">INVOKE</span><span class="special">(</span><span class="identifier">DECAY_COPY</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">func</span><span class="special">)),</span>
14070                    <span class="special">*</span><span class="keyword">this</span><span class="special">)</span></code> shall be a valid expression.
14071                  </p></dd>
14072<dt><span class="term">Effects:</span></dt>
14073<dd>
14074<p>
14075                    All the functions create a shared state that is associated with
14076                    the returned future object. Additionally,
14077                  </p>
14078<p>
14079                    - When the object's shared state is ready, the continuation
14080                    <code class="computeroutput"><span class="identifier">INVOKE</span><span class="special">(</span><span class="identifier">DECAY_COPY</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">func</span><span class="special">)),</span>
14081                    <span class="special">*</span><span class="keyword">this</span><span class="special">)</span></code> is called depending on the overload
14082                    (see below) with the call to DECAY_COPY() being evaluated in
14083                    the thread that called then.
14084                  </p>
14085<p>
14086                    - Any value returned from the continuation is stored as the result
14087                    in the shared state of the resulting <code class="computeroutput"><span class="identifier">future</span></code>.
14088                    Any exception propagated from the execution of the continuation
14089                    is stored as the exceptional result in the shared state of the
14090                    resulting <code class="computeroutput"><span class="identifier">future</span></code>.
14091                  </p>
14092<p>
14093                    The continuation launches according to the specified policy or
14094                    executor or noting.
14095                  </p>
14096<p>
14097                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">none</span></code>
14098                    the continuation is called on an unspecified thread of execution.
14099                  </p>
14100<p>
14101                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
14102                    the continuation is called on a new thread of execution.
14103                  </p>
14104<p>
14105                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
14106                    the continuation is called on demand.
14107                  </p>
14108<p>
14109                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">executor</span></code>
14110                    the continuation is called on one of the thread of execution
14111                    of the executor.
14112                  </p>
14113<p>
14114                    - When the launch policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">inherit</span></code>
14115                    the continuation inherits the parent's launch policy or executor.
14116                  </p>
14117<p>
14118                    - When the executor or launch policy is not provided (first overload)
14119                    is if as if launch::none was specified.
14120                  </p>
14121<p>
14122                    - When the executor is provided (second overload) the continuation
14123                    is called on one of the thread of execution of the executor.
14124                  </p>
14125<p>
14126                    - If the parent has a policy of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
14127                    and the continuation does not have a specified launch policy
14128                    executor, then the parent is filled by immediately calling <code class="computeroutput"><span class="special">.</span><span class="identifier">wait</span><span class="special">()</span></code>, and the policy of the antecedent
14129                    is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>.
14130                  </p>
14131</dd>
14132<dt><span class="term">Returns:</span></dt>
14133<dd><p>
14134                    An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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
14135                    state created by the continuation.
14136                  </p></dd>
14137<dt><span class="term">Notes:</span></dt>
14138<dd>
14139<p>
14140                    - Note that nested futures are not implicitly unwrapped yet.
14141                    This could be subject to change in future versions.
14142                  </p>
14143<p>
14144                    - The returned futures behave as the ones returned from boost::async,
14145                    the destructor of the future object returned from then will block.
14146                    This could be subject to change in future versions.
14147                  </p>
14148</dd>
14149<dt><span class="term">Postconditions:</span></dt>
14150<dd>
14151<p>
14152                    - The future object is moved to the parameter of the continuation
14153                    function .
14154                  </p>
14155<p>
14156                    - <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
14157                    <span class="special">==</span> <span class="keyword">true</span></code>
14158                    on original <code class="computeroutput"><span class="identifier">shared_future</span></code>;
14159                    <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
14160                    <span class="special">==</span> <span class="keyword">true</span></code>
14161                    on the <code class="computeroutput"><span class="identifier">future</span></code>
14162                    returned from then.
14163                  </p>
14164</dd>
14165</dl>
14166</div>
14167</div>
14168</div>
14169<div class="section">
14170<div class="titlepage"><div><div><h5 class="title">
14171<a name="thread.synchronization.futures.reference.promise"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">promise</span></code> class template</a>
14172</h5></div></div></div>
14173<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">&gt;</span>
14174<span class="keyword">class</span> <span class="identifier">promise</span>
14175<span class="special">{</span>
14176<span class="keyword">public</span><span class="special">:</span>
14177  <span class="keyword">typedef</span> <span class="identifier">R</span> <span class="identifier">value_type</span><span class="special">;</span>  <span class="comment">// EXTENSION</span>
14178
14179  <span class="identifier">promise</span><span class="special">();</span>
14180  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
14181  <span class="identifier">promise</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">);</span>
14182  <span class="identifier">promise</span> <span class="special">&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>
14183  <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>
14184  <span class="special">~</span><span class="identifier">promise</span><span class="special">();</span>
14185
14186  <span class="comment">// Move support</span>
14187  <span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="special">&amp;&amp;</span> <span class="identifier">rhs</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;;</span>
14188  <span class="identifier">promise</span> <span class="special">&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>
14189
14190  <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>
14191  <span class="comment">// Result retrieval</span>
14192   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
14193
14194  <span class="comment">// Set the value</span>
14195  <span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span>
14196  <span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span>
14197  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
14198  <span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14199
14200  <span class="comment">// setting the result with deferred notification</span>
14201  <span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span>
14202  <span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">p</span><span class="special">);</span>
14203  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
14204  <span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">p</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
14205
14206  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
14207  <span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14208
14209  <span class="keyword">void</span> <span class="identifier">set_value_deferred</span><span class="special">(</span><span class="identifier">see</span> <span class="identifier">below</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
14210  <span class="keyword">void</span> <span class="identifier">set_exception_deferred</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">p</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
14211  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
14212  <span class="keyword">void</span> <span class="identifier">set_exception_deferred</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14213  <span class="keyword">void</span> <span class="identifier">notify_deferred</span><span class="special">();</span> <span class="comment">// EXTENSION</span>
14214
14215<span class="special">};</span>
14216</pre>
14217<div class="section">
14218<div class="titlepage"><div><div><h6 class="title">
14219<a name="thread.synchronization.futures.reference.promise.default_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.default_constructor" title="Default Constructor">Default
14220            Constructor</a>
14221</h6></div></div></div>
14222<pre class="programlisting"><span class="identifier">promise</span><span class="special">();</span>
14223</pre>
14224<div class="variablelist">
14225<p class="title"><b></b></p>
14226<dl class="variablelist">
14227<dt><span class="term">Effects:</span></dt>
14228<dd><p>
14229                    Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> with no associated
14230                    result.
14231                  </p></dd>
14232<dt><span class="term">Throws:</span></dt>
14233<dd><p>
14234                    Nothing.
14235                  </p></dd>
14236</dl>
14237</div>
14238</div>
14239<div class="section">
14240<div class="titlepage"><div><div><h6 class="title">
14241<a name="thread.synchronization.futures.reference.promise.alloc_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.alloc_constructor" title="Allocator Constructor">Allocator
14242            Constructor</a>
14243</h6></div></div></div>
14244<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
14245<span class="identifier">promise</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">);</span>
14246</pre>
14247<div class="variablelist">
14248<p class="title"><b></b></p>
14249<dl class="variablelist">
14250<dt><span class="term">Effects:</span></dt>
14251<dd><p>
14252                    Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> with no associated
14253                    result using the allocator <code class="computeroutput"><span class="identifier">a</span></code>.
14254                  </p></dd>
14255<dt><span class="term">Throws:</span></dt>
14256<dd><p>
14257                    Nothing.
14258                  </p></dd>
14259<dt><span class="term">Notes:</span></dt>
14260<dd><p>
14261                    Available only if BOOST_THREAD_FUTURE_USES_ALLOCATORS is defined.
14262                  </p></dd>
14263</dl>
14264</div>
14265</div>
14266<div class="section">
14267<div class="titlepage"><div><div><h6 class="title">
14268<a name="thread.synchronization.futures.reference.promise.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.move_constructor" title="Move Constructor">Move
14269            Constructor</a>
14270</h6></div></div></div>
14271<pre class="programlisting"><span class="identifier">promise</span><span class="special">(</span><span class="identifier">promise</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
14272</pre>
14273<div class="variablelist">
14274<p class="title"><b></b></p>
14275<dl class="variablelist">
14276<dt><span class="term">Effects:</span></dt>
14277<dd><p>
14278                    Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a>, and transfers
14279                    ownership of the result associated with <code class="computeroutput"><span class="identifier">other</span></code>
14280                    to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
14281                    leaving <code class="computeroutput"><span class="identifier">other</span></code>
14282                    with no associated result.
14283                  </p></dd>
14284<dt><span class="term">Throws:</span></dt>
14285<dd><p>
14286                    Nothing.
14287                  </p></dd>
14288<dt><span class="term">Notes:</span></dt>
14289<dd><p>
14290                    If the compiler does not support rvalue-references, this is implemented
14291                    using the boost.thread move emulation.
14292                  </p></dd>
14293</dl>
14294</div>
14295</div>
14296<div class="section">
14297<div class="titlepage"><div><div><h6 class="title">
14298<a name="thread.synchronization.futures.reference.promise.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.move_assignment" title="Move Assignment Operator">Move
14299            Assignment Operator</a>
14300</h6></div></div></div>
14301<pre class="programlisting"><span class="identifier">promise</span><span class="special">&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>
14302</pre>
14303<div class="variablelist">
14304<p class="title"><b></b></p>
14305<dl class="variablelist">
14306<dt><span class="term">Effects:</span></dt>
14307<dd><p>
14308                    Transfers ownership of the result associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, leaving <code class="computeroutput"><span class="identifier">other</span></code>
14309                    with no associated result. If there was already a result associated
14310                    with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
14311                    and that result was not <span class="emphasis"><em>ready</em></span>, sets any
14312                    futures associated with that result to <span class="emphasis"><em>ready</em></span>
14313                    with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code>
14314                    exception as the result.
14315                  </p></dd>
14316<dt><span class="term">Throws:</span></dt>
14317<dd><p>
14318                    Nothing.
14319                  </p></dd>
14320<dt><span class="term">Notes:</span></dt>
14321<dd><p>
14322                    If the compiler does not support rvalue-references, this is implemented
14323                    using the boost.thread move emulation.
14324                  </p></dd>
14325</dl>
14326</div>
14327</div>
14328<div class="section">
14329<div class="titlepage"><div><div><h6 class="title">
14330<a name="thread.synchronization.futures.reference.promise.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.destructor" title="Destructor">Destructor</a>
14331</h6></div></div></div>
14332<pre class="programlisting"><span class="special">~</span><span class="identifier">promise</span><span class="special">();</span>
14333</pre>
14334<div class="variablelist">
14335<p class="title"><b></b></p>
14336<dl class="variablelist">
14337<dt><span class="term">Effects:</span></dt>
14338<dd><p>
14339                    Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
14340                    If there was a result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and that result is not
14341                    <span class="emphasis"><em>ready</em></span>, sets any futures associated with
14342                    that task to <span class="emphasis"><em>ready</em></span> with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> exception as
14343                    the result.
14344                  </p></dd>
14345<dt><span class="term">Throws:</span></dt>
14346<dd><p>
14347                    Nothing.
14348                  </p></dd>
14349</dl>
14350</div>
14351</div>
14352<div class="section">
14353<div class="titlepage"><div><div><h6 class="title">
14354<a name="thread.synchronization.futures.reference.promise.get_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.get_future" title="Member Function get_future()">Member
14355            Function <code class="computeroutput"><span class="identifier">get_future</span><span class="special">()</span></code></a>
14356</h6></div></div></div>
14357<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
14358</pre>
14359<div class="variablelist">
14360<p class="title"><b></b></p>
14361<dl class="variablelist">
14362<dt><span class="term">Effects:</span></dt>
14363<dd><p>
14364                    If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14365                    was not associated with a result, allocate storage for a new
14366                    shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> associated with
14367                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
14368                  </p></dd>
14369<dt><span class="term">Throws:</span></dt>
14370<dd><p>
14371                    <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_already_retrieved</span></code> if
14372                    the future associated with the task has already been retrieved.
14373                    <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if any memory necessary
14374                    could not be allocated.
14375                  </p></dd>
14376</dl>
14377</div>
14378</div>
14379<div class="section">
14380<div class="titlepage"><div><div><h6 class="title">
14381<a name="thread.synchronization.futures.reference.promise.set_value"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value" title="Member Function set_value()">Member
14382            Function <code class="computeroutput"><span class="identifier">set_value</span><span class="special">()</span></code></a>
14383</h6></div></div></div>
14384<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="identifier">R</span><span class="special">&amp;&amp;</span> <span class="identifier">r</span><span class="special">);</span>
14385<span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
14386<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>
14387<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>
14388</pre>
14389<div class="variablelist">
14390<p class="title"><b></b></p>
14391<dl class="variablelist">
14392<dt><span class="term">Effects:</span></dt>
14393<dd>
14394<p>
14395                    - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14396                    was not associated with a result, allocate storage for a new
14397                    shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
14398                  </p>
14399<p>
14400                    - Store the value <code class="computeroutput"><span class="identifier">r</span></code>
14401                    in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Any threads blocked waiting
14402                    for the asynchronous result are woken.
14403                  </p>
14404</dd>
14405<dt><span class="term">Postconditions:</span></dt>
14406<dd><p>
14407                    All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
14408                    and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_value</span><span class="special">()</span></code></a>
14409                    or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_value</span><span class="special">()</span></code></a>
14410                    for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
14411                  </p></dd>
14412<dt><span class="term">Throws:</span></dt>
14413<dd>
14414<p>
14415                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
14416                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>.
14417                  </p>
14418<p>
14419                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14420                    has no shared state.
14421                  </p>
14422<p>
14423                    - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
14424                    for storage of the result cannot be allocated.
14425                  </p>
14426<p>
14427                    - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>.
14428                  </p>
14429</dd>
14430</dl>
14431</div>
14432</div>
14433<div class="section">
14434<div class="titlepage"><div><div><h6 class="title">
14435<a name="thread.synchronization.futures.reference.promise.set_exception"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_exception" title="Member Function set_exception()">Member
14436            Function <code class="computeroutput"><span class="identifier">set_exception</span><span class="special">()</span></code></a>
14437</h6></div></div></div>
14438<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span>
14439<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
14440<span class="keyword">void</span> <span class="identifier">set_exception</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14441</pre>
14442<div class="variablelist">
14443<p class="title"><b></b></p>
14444<dl class="variablelist">
14445<dt><span class="term">Effects:</span></dt>
14446<dd>
14447<p>
14448                    - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14449                    was not associated with a result, allocate storage for a new
14450                    shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
14451                  </p>
14452<p>
14453                    - Store the exception <code class="computeroutput"><span class="identifier">e</span></code>
14454                    in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. Any threads blocked waiting
14455                    for the asynchronous result are woken.
14456                  </p>
14457</dd>
14458<dt><span class="term">Postconditions:</span></dt>
14459<dd><p>
14460                    All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
14461                    and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_exception" title="Member function has_exception() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
14462                    or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_exception" title="Member function has_exception() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_exception</span><span class="special">()</span></code></a>
14463                    for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
14464                  </p></dd>
14465<dt><span class="term">Throws:</span></dt>
14466<dd>
14467<p>
14468                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
14469                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>.
14470                  </p>
14471<p>
14472                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14473                    has no shared state.
14474                  </p>
14475<p>
14476                    - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
14477                    for storage of the result cannot be allocated.
14478                  </p>
14479</dd>
14480</dl>
14481</div>
14482</div>
14483<div class="section">
14484<div class="titlepage"><div><div><h6 class="title">
14485<a name="thread.synchronization.futures.reference.promise.set_value_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value_at_thread_exit" title="Member Function set_value_at_thread_exit()">Member
14486            Function <code class="computeroutput"><span class="identifier">set_value_at_thread_exit</span><span class="special">()</span></code></a>
14487</h6></div></div></div>
14488<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="identifier">R</span><span class="special">&amp;&amp;</span> <span class="identifier">r</span><span class="special">);</span>
14489<span class="keyword">void</span> <span class="identifier">set_value_at_thread_exit</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
14490<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>
14491<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>
14492</pre>
14493<div class="variablelist">
14494<p class="title"><b></b></p>
14495<dl class="variablelist">
14496<dt><span class="term">Effects:</span></dt>
14497<dd><p>
14498                    Stores the value r in the shared state without making that state
14499                    ready immediately. Schedules that state to be made ready when
14500                    the current thread exits, after all objects of thread storage
14501                    duration associated with the current thread have been destroyed.
14502                  </p></dd>
14503<dt><span class="term">Postconditions:</span></dt>
14504<dd><p>
14505                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is set as deferred
14506                  </p></dd>
14507<dt><span class="term">Throws:</span></dt>
14508<dd>
14509<p>
14510                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
14511                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>
14512                    or deferred.
14513                  </p>
14514<p>
14515                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14516                    has no shared state.
14517                  </p>
14518<p>
14519                    - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
14520                    for storage of the result cannot be allocated.
14521                  </p>
14522<p>
14523                    - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>.
14524                  </p>
14525</dd>
14526</dl>
14527</div>
14528</div>
14529<div class="section">
14530<div class="titlepage"><div><div><h6 class="title">
14531<a name="thread.synchronization.futures.reference.promise.set_exception_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_exception_at_thread_exit" title="Member Function set_exception_at_thread_exit()">Member
14532            Function <code class="computeroutput"><span class="identifier">set_exception_at_thread_exit</span><span class="special">()</span></code></a>
14533</h6></div></div></div>
14534<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span>
14535<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
14536<span class="keyword">void</span> <span class="identifier">set_exception_at_thread_exit</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">p</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
14537</pre>
14538<div class="variablelist">
14539<p class="title"><b></b></p>
14540<dl class="variablelist">
14541<dt><span class="term">Effects:</span></dt>
14542<dd><p>
14543                    Stores the exception pointer p in the shared state without making
14544                    that state ready immediately. Schedules that state to be made
14545                    ready when the current thread exits, after all objects of thread
14546                    storage duration associated with the current thread have been
14547                    destroyed.
14548                  </p></dd>
14549<dt><span class="term">Postconditions:</span></dt>
14550<dd><p>
14551                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is set as deferred
14552                  </p></dd>
14553<dt><span class="term">Throws:</span></dt>
14554<dd>
14555<p>
14556                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
14557                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>
14558                    or deferred.
14559                  </p>
14560<p>
14561                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14562                    has no shared state.
14563                  </p>
14564<p>
14565                    - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
14566                    for storage of the result cannot be allocated.
14567                  </p>
14568</dd>
14569</dl>
14570</div>
14571</div>
14572<div class="section">
14573<div class="titlepage"><div><div><h6 class="title">
14574<a name="thread.synchronization.futures.reference.promise.set_wait_callback"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_wait_callback" title="Member Function set_wait_callback() EXTENSION">Member
14575            Function <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> EXTENSION</a>
14576</h6></div></div></div>
14577<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
14578<span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
14579</pre>
14580<div class="variablelist">
14581<p class="title"><b></b></p>
14582<dl class="variablelist">
14583<dt><span class="term">Preconditions:</span></dt>
14584<dd><p>
14585                    The expression <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> where <code class="computeroutput"><span class="identifier">t</span></code>
14586                    is a lvalue of type <a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise" title="promise class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise</span></code></a> shall be well-formed.
14587                    Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code>
14588                    shall have the same effect as invoking <code class="computeroutput"><span class="identifier">f</span></code>
14589                  </p></dd>
14590<dt><span class="term">Effects:</span></dt>
14591<dd><p>
14592                    Store a copy of <code class="computeroutput"><span class="identifier">f</span></code>
14593                    with the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as a <span class="emphasis"><em>wait callback</em></span>.
14594                    This will replace any existing wait callback store alongside
14595                    that result. If a thread subsequently calls one of the wait functions
14596                    on a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> associated
14597                    with this result, and the result is not <span class="emphasis"><em>ready</em></span>,
14598                    <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>
14599                    shall be invoked.
14600                  </p></dd>
14601<dt><span class="term">Throws:</span></dt>
14602<dd><p>
14603                    <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory cannot
14604                    be allocated for the required storage.
14605                  </p></dd>
14606</dl>
14607</div>
14608</div>
14609<div class="section">
14610<div class="titlepage"><div><div><h6 class="title">
14611<a name="thread.synchronization.futures.reference.promise.set_value0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value0" title="Member Function set_value_deferred() EXTENSION">Member
14612            Function <code class="computeroutput"><span class="identifier">set_value_deferred</span><span class="special">()</span></code> EXTENSION</a>
14613</h6></div></div></div>
14614<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_value_deferred</span><span class="special">(</span><span class="identifier">R</span><span class="special">&amp;&amp;</span> <span class="identifier">r</span><span class="special">);</span>
14615<span class="keyword">void</span> <span class="identifier">set_value_deferred</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
14616<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_deferred</span><span class="special">(</span><span class="identifier">R</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">);</span>
14617<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_deferred</span><span class="special">();</span>
14618</pre>
14619<div class="variablelist">
14620<p class="title"><b></b></p>
14621<dl class="variablelist">
14622<dt><span class="term">Effects:</span></dt>
14623<dd>
14624<p>
14625                    - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14626                    was not associated with a result, allocate storage for a new
14627                    shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
14628                  </p>
14629<p>
14630                    - Stores the value <code class="computeroutput"><span class="identifier">r</span></code>
14631                    in the shared state without making that state ready immediately.
14632                    Threads blocked waiting for the asynchronous result are not woken.
14633                    They will be woken only when <code class="computeroutput"><span class="identifier">notify_deferred</span></code>
14634                    is called.
14635                  </p>
14636</dd>
14637<dt><span class="term">Postconditions:</span></dt>
14638<dd><p>
14639                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is set as deferred
14640                  </p></dd>
14641<dt><span class="term">Throws:</span></dt>
14642<dd>
14643<p>
14644                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
14645                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>
14646                    or deferred.
14647                  </p>
14648<p>
14649                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14650                    has no shared state.
14651                  </p>
14652<p>
14653                    - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
14654                    for storage of the result cannot be allocated.
14655                  </p>
14656<p>
14657                    - Any exception thrown by the copy or move-constructor of <code class="computeroutput"><span class="identifier">R</span></code>.
14658                  </p>
14659</dd>
14660</dl>
14661</div>
14662</div>
14663<div class="section">
14664<div class="titlepage"><div><div><h6 class="title">
14665<a name="thread.synchronization.futures.reference.promise.set_exception0"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_exception0" title="Member Function set_exception_deferred() EXTENSION">Member
14666            Function <code class="computeroutput"><span class="identifier">set_exception_deferred</span><span class="special">()</span></code> EXTENSION</a>
14667</h6></div></div></div>
14668<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_exception_deferred</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">e</span><span class="special">);</span>
14669<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
14670<span class="keyword">void</span> <span class="identifier">set_exception_deferred</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">e</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
14671</pre>
14672<div class="variablelist">
14673<p class="title"><b></b></p>
14674<dl class="variablelist">
14675<dt><span class="term">Effects:</span></dt>
14676<dd>
14677<p>
14678                    - If BOOST_THREAD_PROVIDES_PROMISE_LAZY is defined and if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14679                    was not associated with a result, allocate storage for a new
14680                    shared state and associate it with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
14681                  </p>
14682<p>
14683                    - Store the exception <code class="computeroutput"><span class="identifier">e</span></code>
14684                    in the shared state associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>without making that state
14685                    ready immediately. Threads blocked waiting for the asynchronous
14686                    result are not woken. They will be woken only when <code class="computeroutput"><span class="identifier">notify_deferred</span></code> is called.
14687                  </p>
14688</dd>
14689<dt><span class="term">Postconditions:</span></dt>
14690<dd><p>
14691                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is set as deferred
14692                  </p></dd>
14693<dt><span class="term">Throws:</span></dt>
14694<dd>
14695<p>
14696                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">promise_already_satisfied</span></code> if
14697                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is already <span class="emphasis"><em>ready</em></span>
14698                    or deferred.
14699                  </p>
14700<p>
14701                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
14702                    has no shared state.
14703                  </p>
14704<p>
14705                    - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if the memory required
14706                    for storage of the result cannot be allocated.
14707                  </p>
14708</dd>
14709</dl>
14710</div>
14711</div>
14712<div class="section">
14713<div class="titlepage"><div><div><h6 class="title">
14714<a name="thread.synchronization.futures.reference.promise.set_value1"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.promise.set_value1" title="Member Function notify_deferred() EXTENSION">Member
14715            Function <code class="computeroutput"><span class="identifier">notify_deferred</span><span class="special">()</span></code> EXTENSION</a>
14716</h6></div></div></div>
14717<div class="variablelist">
14718<p class="title"><b></b></p>
14719<dl class="variablelist">
14720<dt><span class="term">Effects:</span></dt>
14721<dd><p>
14722                    Any threads blocked waiting for the asynchronous result are woken.
14723                  </p></dd>
14724<dt><span class="term">Postconditions:</span></dt>
14725<dd><p>
14726                    All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
14727                    and <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_value</span><span class="special">()</span></code></a>
14728                    or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future.has_value" title="Member function has_value() EXTENSION"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">has_value</span><span class="special">()</span></code></a>
14729                    for those futures shall return <code class="computeroutput"><span class="keyword">true</span></code>.
14730                  </p></dd>
14731<dt><span class="term">Postconditions:</span></dt>
14732<dd><p>
14733                    the result associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is ready.
14734                  </p></dd>
14735</dl>
14736</div>
14737</div>
14738</div>
14739<div class="section">
14740<div class="titlepage"><div><div><h5 class="title">
14741<a name="thread.synchronization.futures.reference.packaged_task"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">packaged_task</span></code> class template</a>
14742</h5></div></div></div>
14743<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">&gt;</span>
14744<span class="keyword">class</span> <span class="identifier">packaged_task</span><span class="special">;</span>
14745<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">R</span>
14746  <span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">ArgTypes</span>
14747<span class="special">&gt;</span>
14748<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>
14749<span class="special">{</span>
14750<span class="keyword">public</span><span class="special">:</span>
14751  <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
14752  <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>
14753
14754  <span class="comment">// construction and destruction</span>
14755  <span class="identifier">packaged_task</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
14756
14757  <span class="keyword">explicit</span> <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span>
14758
14759  <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
14760  <span class="keyword">explicit</span> <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
14761
14762  <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>
14763  <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span>
14764  <span class="keyword">template</span> <span class="special">&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>
14765  <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
14766
14767  <span class="special">~</span><span class="identifier">packaged_task</span><span class="special">()</span>
14768  <span class="special">{}</span>
14769
14770  <span class="comment">// move support</span>
14771  <span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
14772  <span class="identifier">packaged_task</span><span class="special">&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>
14773
14774  <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">packaged_task</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
14775
14776  <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
14777  <span class="comment">// result retrieval</span>
14778   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
14779
14780  <span class="comment">// execution</span>
14781  <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgTypes</span><span class="special">...</span> <span class="special">);</span>
14782  <span class="keyword">void</span> <span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">...);</span>
14783
14784  <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
14785  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
14786  <span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
14787<span class="special">};</span>
14788</pre>
14789<div class="section">
14790<div class="titlepage"><div><div><h6 class="title">
14791<a name="thread.synchronization.futures.reference.packaged_task.task_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.task_constructor" title="Task Constructor">Task
14792            Constructor</a>
14793</h6></div></div></div>
14794<pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span>
14795
14796<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
14797<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>
14798</pre>
14799<div class="variablelist">
14800<p class="title"><b></b></p>
14801<dl class="variablelist">
14802<dt><span class="term">Preconditions:</span></dt>
14803<dd><p>
14804                    <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code>
14805                    is a valid expression with a return type convertible to <code class="computeroutput"><span class="identifier">R</span></code>. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code> must behave the same as invoking
14806                    <code class="computeroutput"><span class="identifier">f</span></code>.
14807                  </p></dd>
14808<dt><span class="term">Effects:</span></dt>
14809<dd><p>
14810                    Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> with
14811                    <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)</span></code>
14812                    stored as the associated task.
14813                  </p></dd>
14814<dt><span class="term">Throws:</span></dt>
14815<dd>
14816<p>
14817                    - Any exceptions thrown by the copy (or move) constructor of
14818                    <code class="computeroutput"><span class="identifier">f</span></code>.
14819                  </p>
14820<p>
14821                    - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory for the
14822                    internal data structures could not be allocated.
14823                  </p>
14824</dd>
14825<dt><span class="term">Notes:</span></dt>
14826<dd><p>
14827                    The R(*f)(ArgTypes...)) overload to allow passing a function
14828                    without needing to use <code class="computeroutput"><span class="special">&amp;</span></code>.
14829                  </p></dd>
14830<dt><span class="term">Remark:</span></dt>
14831<dd><p>
14832                    This constructor doesn't participate in overload resolution if
14833                    decay&lt;F&gt;::type is the same type as boost::packaged_task&lt;R&gt;.
14834                  </p></dd>
14835</dl>
14836</div>
14837</div>
14838<div class="section">
14839<div class="titlepage"><div><div><h6 class="title">
14840<a name="thread.synchronization.futures.reference.packaged_task.alloc_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.alloc_constructor" title="Allocator Constructor">Allocator
14841            Constructor</a>
14842</h6></div></div></div>
14843<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
14844<span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">R</span><span class="special">(*</span><span class="identifier">f</span><span class="special">)(</span><span class="identifier">ArgTypes</span><span class="special">...));</span>
14845<span class="keyword">template</span> <span class="special">&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>
14846<span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
14847</pre>
14848<div class="variablelist">
14849<p class="title"><b></b></p>
14850<dl class="variablelist">
14851<dt><span class="term">Preconditions:</span></dt>
14852<dd><p>
14853                    <code class="computeroutput"><span class="identifier">f</span><span class="special">()</span></code>
14854                    is a valid expression with a return type convertible to <code class="computeroutput"><span class="identifier">R</span></code>. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code> shall behave the same as
14855                    invoking <code class="computeroutput"><span class="identifier">f</span></code>.
14856                  </p></dd>
14857<dt><span class="term">Effects:</span></dt>
14858<dd><p>
14859                    Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> with
14860                    <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)</span></code>
14861                    stored as the associated task using the allocator <code class="computeroutput"><span class="identifier">a</span></code>.
14862                  </p></dd>
14863<dt><span class="term">Throws:</span></dt>
14864<dd><p>
14865                    Any exceptions thrown by the copy (or move) constructor of <code class="computeroutput"><span class="identifier">f</span></code>. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code>
14866                    if memory for the internal data structures could not be allocated.
14867                  </p></dd>
14868<dt><span class="term">Notes:</span></dt>
14869<dd><p>
14870                    Available only if BOOST_THREAD_FUTURE_USES_ALLOCATORS is defined.
14871                  </p></dd>
14872<dt><span class="term">Notes:</span></dt>
14873<dd><p>
14874                    The R(*f)(ArgTypes...)) overload to allow passing a function
14875                    without needing to use <code class="computeroutput"><span class="special">&amp;</span></code>.
14876                  </p></dd>
14877</dl>
14878</div>
14879</div>
14880<div class="section">
14881<div class="titlepage"><div><div><h6 class="title">
14882<a name="thread.synchronization.futures.reference.packaged_task.move_constructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.move_constructor" title="Move Constructor">Move
14883            Constructor</a>
14884</h6></div></div></div>
14885<pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">(</span><span class="identifier">packaged_task</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">);</span>
14886</pre>
14887<div class="variablelist">
14888<p class="title"><b></b></p>
14889<dl class="variablelist">
14890<dt><span class="term">Effects:</span></dt>
14891<dd><p>
14892                    Constructs a new <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>, and transfers
14893                    ownership of the task associated with <code class="computeroutput"><span class="identifier">other</span></code>
14894                    to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
14895                    leaving <code class="computeroutput"><span class="identifier">other</span></code>
14896                    with no associated task.
14897                  </p></dd>
14898<dt><span class="term">Throws:</span></dt>
14899<dd><p>
14900                    Nothing.
14901                  </p></dd>
14902<dt><span class="term">Notes:</span></dt>
14903<dd><p>
14904                    If the compiler does not support rvalue-references, this is implemented
14905                    using the boost.thread move emulation.
14906                  </p></dd>
14907</dl>
14908</div>
14909</div>
14910<div class="section">
14911<div class="titlepage"><div><div><h6 class="title">
14912<a name="thread.synchronization.futures.reference.packaged_task.move_assignment"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.move_assignment" title="Move Assignment Operator">Move
14913            Assignment Operator</a>
14914</h6></div></div></div>
14915<pre class="programlisting"><span class="identifier">packaged_task</span><span class="special">&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>
14916</pre>
14917<div class="variablelist">
14918<p class="title"><b></b></p>
14919<dl class="variablelist">
14920<dt><span class="term">Effects:</span></dt>
14921<dd><p>
14922                    Transfers ownership of the task associated with <code class="computeroutput"><span class="identifier">other</span></code> to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, leaving <code class="computeroutput"><span class="identifier">other</span></code>
14923                    with no associated task. If there was already a task associated
14924                    with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
14925                    and that task has not been invoked, sets any futures associated
14926                    with that task to <span class="emphasis"><em>ready</em></span> with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code> exception as
14927                    the result.
14928                  </p></dd>
14929<dt><span class="term">Throws:</span></dt>
14930<dd><p>
14931                    Nothing.
14932                  </p></dd>
14933<dt><span class="term">Notes:</span></dt>
14934<dd><p>
14935                    If the compiler does not support rvalue-references, this is implemented
14936                    using the boost.thread move emulation.
14937                  </p></dd>
14938</dl>
14939</div>
14940</div>
14941<div class="section">
14942<div class="titlepage"><div><div><h6 class="title">
14943<a name="thread.synchronization.futures.reference.packaged_task.destructor"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.destructor" title="Destructor">Destructor</a>
14944</h6></div></div></div>
14945<pre class="programlisting"><span class="special">~</span><span class="identifier">packaged_task</span><span class="special">();</span>
14946</pre>
14947<div class="variablelist">
14948<p class="title"><b></b></p>
14949<dl class="variablelist">
14950<dt><span class="term">Effects:</span></dt>
14951<dd><p>
14952                    Destroys <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
14953                    If there was a task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, and that task has not been
14954                    invoked, sets any futures associated with that task to <span class="emphasis"><em>ready</em></span>
14955                    with a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">broken_promise</span></code>
14956                    exception as the result.
14957                  </p></dd>
14958<dt><span class="term">Throws:</span></dt>
14959<dd><p>
14960                    Nothing.
14961                  </p></dd>
14962</dl>
14963</div>
14964</div>
14965<div class="section">
14966<div class="titlepage"><div><div><h6 class="title">
14967<a name="thread.synchronization.futures.reference.packaged_task.get_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.get_future" title="Member Function get_future()">Member
14968            Function <code class="computeroutput"><span class="identifier">get_future</span><span class="special">()</span></code></a>
14969</h6></div></div></div>
14970<pre class="programlisting"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span> <span class="identifier">get_future</span><span class="special">();</span>
14971</pre>
14972<div class="variablelist">
14973<p class="title"><b></b></p>
14974<dl class="variablelist">
14975<dt><span class="term">Effects:</span></dt>
14976<dd><p>
14977                    Returns a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> associated with
14978                    the result of the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
14979                  </p></dd>
14980<dt><span class="term">Throws:</span></dt>
14981<dd><p>
14982                    <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
14983                    the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
14984                    instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">future_already_retrieved</span></code> if
14985                    the future associated with the task has already been retrieved.
14986                  </p></dd>
14987</dl>
14988</div>
14989</div>
14990<div class="section">
14991<div class="titlepage"><div><div><h6 class="title">
14992<a name="thread.synchronization.futures.reference.packaged_task.call_operator"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.call_operator" title="Member Function operator()()">Member
14993            Function <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code></a>
14994</h6></div></div></div>
14995<pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()();</span>
14996</pre>
14997<div class="variablelist">
14998<p class="title"><b></b></p>
14999<dl class="variablelist">
15000<dt><span class="term">Effects:</span></dt>
15001<dd><p>
15002                    Invoke the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and store the result in the
15003                    corresponding future. If the task returns normally, the return
15004                    value is stored as the shared state, otherwise the exception
15005                    thrown is stored. Any threads blocked waiting for the shared
15006                    state associated with this task are woken.
15007                  </p></dd>
15008<dt><span class="term">Postconditions:</span></dt>
15009<dd><p>
15010                    All futures waiting on the shared state are <span class="emphasis"><em>ready</em></span>
15011                  </p></dd>
15012<dt><span class="term">Throws:</span></dt>
15013<dd>
15014<p>
15015                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
15016                    the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
15017                    instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>.
15018                  </p>
15019<p>
15020                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span></code> if the
15021                    task has already been invoked.
15022                  </p>
15023</dd>
15024</dl>
15025</div>
15026</div>
15027<div class="section">
15028<div class="titlepage"><div><div><h6 class="title">
15029<a name="thread.synchronization.futures.reference.packaged_task.make_ready_at_thread_exit"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.make_ready_at_thread_exit" title="Member Function make_ready_at_thread_exit()">Member
15030            Function <code class="computeroutput"><span class="identifier">make_ready_at_thread_exit</span><span class="special">()</span></code></a>
15031</h6></div></div></div>
15032<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">make_ready_at_thread_exit</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">...);</span>
15033</pre>
15034<div class="variablelist">
15035<p class="title"><b></b></p>
15036<dl class="variablelist">
15037<dt><span class="term">Effects:</span></dt>
15038<dd><p>
15039                    Invoke the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and store the result in the
15040                    corresponding future. If the task returns normally, the return
15041                    value is stored as the shared state, otherwise the exception
15042                    thrown is stored. In either case, this is done without making
15043                    that state ready immediately. Schedules the shared state to be
15044                    made ready when the current thread exits, after all objects of
15045                    thread storage duration associated with the current thread have
15046                    been destroyed.
15047                  </p></dd>
15048<dt><span class="term">Throws:</span></dt>
15049<dd>
15050<p>
15051                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
15052                    the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
15053                    instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>.
15054                  </p>
15055<p>
15056                    - <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_already_started</span></code> if the
15057                    task has already been invoked.
15058                  </p>
15059</dd>
15060</dl>
15061</div>
15062</div>
15063<div class="section">
15064<div class="titlepage"><div><div><h6 class="title">
15065<a name="thread.synchronization.futures.reference.packaged_task.reset"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.reset" title="Member Function reset()">Member
15066            Function <code class="computeroutput"><span class="identifier">reset</span><span class="special">()</span></code></a>
15067</h6></div></div></div>
15068<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">reset</span><span class="special">();</span>
15069</pre>
15070<div class="variablelist">
15071<p class="title"><b></b></p>
15072<dl class="variablelist">
15073<dt><span class="term">Effects:</span></dt>
15074<dd><p>
15075                    Reset the state of the packaged_task so that it can be called
15076                    again.
15077                  </p></dd>
15078<dt><span class="term">Throws:</span></dt>
15079<dd><p>
15080                    <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
15081                    the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
15082                    instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>.
15083                  </p></dd>
15084</dl>
15085</div>
15086</div>
15087<div class="section">
15088<div class="titlepage"><div><div><h6 class="title">
15089<a name="thread.synchronization.futures.reference.packaged_task.set_wait_callback"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task.set_wait_callback" title="Member Function set_wait_callback() EXTENSION">Member
15090            Function <code class="computeroutput"><span class="identifier">set_wait_callback</span><span class="special">()</span></code> EXTENSION</a>
15091</h6></div></div></div>
15092<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">&gt;</span>
15093<span class="keyword">void</span> <span class="identifier">set_wait_callback</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">);</span>
15094</pre>
15095<div class="variablelist">
15096<p class="title"><b></b></p>
15097<dl class="variablelist">
15098<dt><span class="term">Preconditions:</span></dt>
15099<dd><p>
15100                    The expression <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> where <code class="computeroutput"><span class="identifier">t</span></code>
15101                    is a lvalue of type <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a> shall
15102                    be well-formed. Invoking a copy of <code class="computeroutput"><span class="identifier">f</span></code>
15103                    shall have the same effect as invoking <code class="computeroutput"><span class="identifier">f</span></code>
15104                  </p></dd>
15105<dt><span class="term">Effects:</span></dt>
15106<dd><p>
15107                    Store a copy of <code class="computeroutput"><span class="identifier">f</span></code>
15108                    with the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> as a <span class="emphasis"><em>wait callback</em></span>.
15109                    This will replace any existing wait callback store alongside
15110                    that task. If a thread subsequently calls one of the wait functions
15111                    on a <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a> associated
15112                    with this task, and the result of the task is not <span class="emphasis"><em>ready</em></span>,
15113                    <code class="computeroutput"><span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">)</span></code>
15114                    shall be invoked.
15115                  </p></dd>
15116<dt><span class="term">Throws:</span></dt>
15117<dd><p>
15118                    <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">task_moved</span></code> if ownership of
15119                    the task associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> has been moved to another
15120                    instance of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.packaged_task" title="packaged_task class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">packaged_task</span></code></a>.
15121                  </p></dd>
15122</dl>
15123</div>
15124</div>
15125</div>
15126<div class="section">
15127<div class="titlepage"><div><div><h5 class="title">
15128<a name="thread.synchronization.futures.reference.decay_copy"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.decay_copy" title="Non-member function decay_copy()">Non-member
15129          function <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code></a>
15130</h5></div></div></div>
15131<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
15132<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>
15133<span class="special">{</span>
15134  <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">);</span>
15135<span class="special">}</span>
15136</pre>
15137</div>
15138<div class="section">
15139<div class="titlepage"><div><div><h5 class="title">
15140<a name="thread.synchronization.futures.reference.async"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async" title="Non-member function async()">Non-member
15141          function <code class="computeroutput"><span class="identifier">async</span><span class="special">()</span></code></a>
15142</h5></div></div></div>
15143<p>
15144            The function template async provides a mechanism to launch a function
15145            potentially in a new thread and provides the result of the function in
15146            a future object with which it shares a shared state.
15147          </p>
15148<h6>
15149<a name="thread.synchronization.futures.reference.async.h0"></a>
15150            <span class="phrase"><a name="thread.synchronization.futures.reference.async.non_variadic_variant"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async.non_variadic_variant">Non-Variadic
15151            variant</a>
15152          </h6>
15153<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">F</span><span class="special">&gt;</span>
15154   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
15155  <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>
15156<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>
15157   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
15158  <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&amp;&amp;</span> <span class="identifier">f</span><span class="special">);</span>
15159<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>
15160   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
15161  <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>
15162</pre>
15163<div class="variablelist">
15164<p class="title"><b></b></p>
15165<dl class="variablelist">
15166<dt><span class="term">Requires:</span></dt>
15167<dd>
15168<p>
15169</p>
15170<pre class="programlisting"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span>
15171</pre>
15172<p>
15173                </p>
15174<p>
15175                  shall be a valid expression.
15176                </p>
15177</dd>
15178<dt><span class="term">Effects</span></dt>
15179<dd>
15180<p>
15181                  The first function behaves the same as a call to the second function
15182                  with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
15183                  <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
15184                  and the same arguments for <code class="computeroutput"><span class="identifier">F</span></code>.
15185                </p>
15186<p>
15187                  The second and third functions create a shared state that is associated
15188                  with the returned future object.
15189                </p>
15190<p>
15191                  The further behavior of the second function depends on the policy
15192                  argument as follows (if more than one of these conditions applies,
15193                  the implementation may choose any of the corresponding policies):
15194                </p>
15195<p>
15196                  - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&amp;</span>
15197                  <span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> is non-zero - calls <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))()</span></code>
15198                  as if in a new thread of execution represented by a thread object
15199                  with the calls to <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code> being evaluated in the thread
15200                  that called <code class="computeroutput"><span class="identifier">async</span></code>.
15201                  Any return value is stored as the result in the shared state. Any
15202                  exception propagated from the execution of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&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
15203                  result in the shared state. The thread object is stored in the
15204                  shared state and affects the behavior of any asynchronous return
15205                  objects that reference that state.
15206                </p>
15207<p>
15208                  - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&amp;</span>
15209                  <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> is non-zero - Stores
15210                  <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))</span></code>
15211                  in the shared state. This copy of <code class="computeroutput"><span class="identifier">f</span></code>
15212                  constitute a deferred function. Invocation of the deferred function
15213                  evaluates <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">)()</span></code> where <code class="computeroutput"><span class="identifier">g</span></code>
15214                  is the stored value of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&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
15215                  ready until the function has completed. The first call to a non-timed
15216                  waiting function on an asynchronous return object referring to
15217                  this shared state shall invoke the deferred function in the thread
15218                  that called the waiting function. Once evaluation of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">)()</span></code>
15219                  begins, the function is no longer considered deferred. (Note: If
15220                  this policy is specified together with other policies, such as
15221                  when using a policy value of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
15222                  <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>,
15223                  implementations should defer invocation or the selection of the
15224                  policy when no more concurrency can be effectively exploited.)
15225                </p>
15226<p>
15227                  - if no valid launch policy is provided the behavior is undefined.
15228                </p>
15229<p>
15230                  The further behavior of the third function is as follows:
15231                </p>
15232<p>
15233                  - The Executor::submit() function is given a function&lt;void ()&gt;
15234                  which calls `INVOKE (DECAY_COPY (std::forward&lt;F&gt;(f)), DECAY_COPY
15235                  (std::forward&lt;Args&gt;(args))...). The implementation of the
15236                  executor is decided by the programmer.
15237                </p>
15238</dd>
15239<dt><span class="term">Returns:</span></dt>
15240<dd><p>
15241                  An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span>
15242                  <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>
15243                  that refers to the shared state created by this call to <code class="computeroutput"><span class="identifier">async</span></code>.
15244                </p></dd>
15245<dt><span class="term">Synchronization:</span></dt>
15246<dd>
15247<p>
15248                  Regardless of the provided policy argument,
15249                </p>
15250<p>
15251                  - the invocation of <code class="computeroutput"><span class="identifier">async</span></code>
15252                  synchronizes with the invocation of <code class="computeroutput"><span class="identifier">f</span></code>.
15253                  (Note: This statement applies even when the corresponding future
15254                  object is moved to another thread.); and
15255                </p>
15256<p>
15257                  - the completion of the function <code class="computeroutput"><span class="identifier">f</span></code>
15258                  is sequenced before the shared state is made ready. (Note: <code class="computeroutput"><span class="identifier">f</span></code> might not be called at all,
15259                  so its completion might never happen.)
15260                </p>
15261<p>
15262                  If the implementation chooses the <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
15263                  policy,
15264                </p>
15265<p>
15266                  - a call to a non-timed waiting function on an asynchronous return
15267                  object that shares the shared state created by this async call
15268                  shall block until the associated thread has completed, as if joined,
15269                  or else time out;
15270                </p>
15271<p>
15272                  - the associated thread completion synchronizes with the return
15273                  from the first function that successfully detects the ready status
15274                  of the shared state or with the return from the last function that
15275                  releases the shared state, whichever happens first.
15276                </p>
15277</dd>
15278<dt><span class="term">Throws:</span></dt>
15279<dd><p>
15280                  <code class="computeroutput"><span class="identifier">system_error</span></code> if
15281                  policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
15282                  and the implementation is unable to start a new thread.
15283                </p></dd>
15284<dt><span class="term">Error conditions:</span></dt>
15285<dd><p>
15286                  - <code class="computeroutput"><span class="identifier">resource_unavailable_try_again</span></code>
15287                  - if policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
15288                  and the system is unable to start a new thread.
15289                </p></dd>
15290<dt><span class="term">Remarks::</span></dt>
15291<dd><p>
15292                  The first signature shall not participate in overload resolution
15293                  if <code class="computeroutput"><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;</span>
15294                  <span class="identifier">is</span> </code>boost:: launch<code class="computeroutput">
15295                  <span class="keyword">or</span> </code>boost::is_executor&lt;F&gt;<code class="computeroutput">
15296                  <span class="identifier">is</span> </code>true_type`.
15297                </p></dd>
15298</dl>
15299</div>
15300<h6>
15301<a name="thread.synchronization.futures.reference.async.h1"></a>
15302            <span class="phrase"><a name="thread.synchronization.futures.reference.async.variadic_variant"></a></span><a class="link" href="synchronization.html#thread.synchronization.futures.reference.async.variadic_variant">Variadic
15303            variant</a>
15304          </h6>
15305<pre class="programlisting"><span class="keyword">template</span> <span class="special">&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>
15306   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
15307  <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>
15308<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>
15309   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
15310  <span class="identifier">async</span><span class="special">(</span><span class="identifier">launch</span> <span class="identifier">policy</span><span class="special">,</span> <span class="identifier">F</span><span class="special">&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>
15311<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>
15312   <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&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>
15313  <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>
15314</pre>
15315<div class="warning"><table border="0" summary="Warning">
15316<tr>
15317<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
15318<th align="left">Warning</th>
15319</tr>
15320<tr><td align="left" valign="top"><p>
15321              the variadic prototype is provided only on C++11 compilers supporting
15322              rvalue references, variadic templates, decltype and a standard library
15323              providing &lt;tuple&gt; (waiting for a boost::tuple that is move aware),
15324              and BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK is defined.
15325            </p></td></tr>
15326</table></div>
15327<div class="variablelist">
15328<p class="title"><b></b></p>
15329<dl class="variablelist">
15330<dt><span class="term">Requires:</span></dt>
15331<dd>
15332<p>
15333                  <code class="computeroutput"><span class="identifier">F</span></code> and each <code class="computeroutput"><span class="identifier">Ti</span></code> in <code class="computeroutput"><span class="identifier">Args</span></code>
15334                  shall satisfy the <code class="computeroutput"><span class="identifier">MoveConstructible</span></code>
15335                  requirements.
15336                </p>
15337<p>
15338                  invoke (decay_copy (boost::forward&lt;F&gt;(f)), decay_copy (boost::forward&lt;Args&gt;(args))...)
15339                </p>
15340<p>
15341                  shall be a valid expression.
15342                </p>
15343</dd>
15344<dt><span class="term">Effects:</span></dt>
15345<dd>
15346<p>
15347                  - The first function behaves the same as a call to the second function
15348                  with a policy argument of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
15349                  <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>
15350                  and the same arguments for <code class="computeroutput"><span class="identifier">F</span></code>
15351                  and <code class="computeroutput"><span class="identifier">Args</span></code>.
15352                </p>
15353<p>
15354                  - The second function creates a shared state that is associated
15355                  with the returned future object. The further behavior of the second
15356                  function depends on the policy argument as follows (if more than
15357                  one of these conditions applies, the implementation may choose
15358                  any of the corresponding policies):
15359                </p>
15360<p>
15361                  - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&amp;</span>
15362                  <span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code> is non-zero - calls <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">)),</span>
15363                  <span class="identifier">decay_copy</span> <span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">Args</span><span class="special">&gt;(</span><span class="identifier">args</span><span class="special">))...)</span></code>
15364                  as if in a new thread of execution represented by a thread object
15365                  with the calls to <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">()</span></code> being evaluated in the thread
15366                  that called <code class="computeroutput"><span class="identifier">async</span></code>.
15367                  Any return value is stored as the result in the shared state. Any
15368                  exception propagated from the execution of <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&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>
15369                  <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
15370                  result in the shared state. The thread object is stored in the
15371                  shared state and affects the behavior of any asynchronous return
15372                  objects that reference that state.
15373                </p>
15374<p>
15375                  - if <code class="computeroutput"><span class="identifier">policy</span> <span class="special">&amp;</span>
15376                  <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code> is non-zero - Stores
15377                  <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&lt;</span><span class="identifier">F</span><span class="special">&gt;(</span><span class="identifier">f</span><span class="special">))</span></code>
15378                  and <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&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
15379                  copies of <code class="computeroutput"><span class="identifier">f</span></code> and
15380                  <code class="computeroutput"><span class="identifier">args</span></code> constitute
15381                  a deferred function. Invocation of the deferred function evaluates
15382                  <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">),</span>
15383                  <span class="identifier">move</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">))</span></code>
15384                  where <code class="computeroutput"><span class="identifier">g</span></code> is the
15385                  stored value of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&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>
15386                  is the stored copy of <code class="computeroutput"><span class="identifier">decay_copy</span><span class="special">(</span><span class="identifier">forward</span><span class="special">&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
15387                  ready until the function has completed. The first call to a non-timed
15388                  waiting function on an asynchronous return object referring to
15389                  this shared state shall invoke the deferred function in the thread
15390                  that called the waiting function. Once evaluation of <code class="computeroutput"><span class="identifier">invoke</span><span class="special">(</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">g</span><span class="special">),</span>
15391                  <span class="identifier">move</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">))</span></code>
15392                  begins, the function is no longer considered deferred.
15393                </p>
15394<p>
15395                  - if no valid launch policy is provided the behaviour is undefined.
15396                </p>
15397</dd>
15398<dt><span class="term">Note:</span></dt>
15399<dd><p>
15400                  If this policy is specified together with other policies, such
15401                  as when using a policy value of <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span>
15402                  <span class="special">|</span> <span class="identifier">launch</span><span class="special">::</span><span class="identifier">deferred</span></code>,
15403                  implementations should defer invocation or the selection of the
15404                  policy when no more concurrency can be effectively exploited.
15405                </p></dd>
15406<dt><span class="term">Returns:</span></dt>
15407<dd><p>
15408                  An object of type <code class="computeroutput"> <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">&lt;</span><span class="keyword">typename</span>
15409                  <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
15410                  created by this call to <code class="computeroutput"><span class="identifier">async</span></code>.
15411                </p></dd>
15412<dt><span class="term">Synchronization:</span></dt>
15413<dd>
15414<p>
15415                  Regardless of the provided policy argument,
15416                </p>
15417<p>
15418                  - the invocation of async synchronizes with the invocation of
15419                  <code class="computeroutput"><span class="identifier">f</span></code>. (Note: This
15420                  statement applies even when the corresponding future object is
15421                  moved to another thread.); and
15422                </p>
15423<p>
15424                  - the completion of the function <code class="computeroutput"><span class="identifier">f</span></code>
15425                  is sequenced before the shared state is made ready. (Note: f might
15426                  not be called at all, so its completion might never happen.)
15427                </p>
15428<p>
15429                  If the implementation chooses the <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
15430                  policy,
15431                </p>
15432<p>
15433                  - a call to a waiting function on an asynchronous return object
15434                  that shares the shared state created by this async call shall block
15435                  until the associated thread has completed, as if joined, or else
15436                  time out;
15437                </p>
15438<p>
15439                  - the associated thread completion synchronizes with the return
15440                  from the first function that successfully detects the ready status
15441                  of the shared state or with the return from the last function that
15442                  releases the shared state, whichever happens first.
15443                </p>
15444</dd>
15445<dt><span class="term">Throws:</span></dt>
15446<dd><p>
15447                  <code class="computeroutput"><span class="identifier">system_error</span></code> if
15448                  policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
15449                  and the implementation is unable to start a new thread.
15450                </p></dd>
15451<dt><span class="term">Error conditions:</span></dt>
15452<dd><p>
15453                  - <code class="computeroutput"><span class="identifier">resource_unavailable_try_again</span></code>
15454                  - if policy is <code class="computeroutput"><span class="identifier">launch</span><span class="special">::</span><span class="identifier">async</span></code>
15455                  and the system is unable to start a new thread.
15456                </p></dd>
15457<dt><span class="term">Remarks:</span></dt>
15458<dd><p>
15459                  The first signature shall not participate in overload resolution
15460                  if decay&lt;F&gt;::type is boost::launch.
15461                </p></dd>
15462</dl>
15463</div>
15464</div>
15465<div class="section">
15466<div class="titlepage"><div><div><h5 class="title">
15467<a name="thread.synchronization.futures.reference.wait_for_any"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_any" title="Non-member function wait_for_any() - EXTENSION">Non-member
15468          function <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
15469          - EXTENSION</a>
15470</h5></div></div></div>
15471<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
15472  <span class="identifier">Iterator</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
15473
15474<span class="keyword">template</span><span class="special">&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>
15475  <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
15476
15477<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>
15478  <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
15479
15480<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>
15481  <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
15482
15483<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>
15484  <span class="keyword">unsigned</span> <span class="identifier">wait_for_any</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
15485</pre>
15486<div class="variablelist">
15487<p class="title"><b></b></p>
15488<dl class="variablelist">
15489<dt><span class="term">Preconditions:</span></dt>
15490<dd><p>
15491                  The types <code class="computeroutput"><span class="identifier">Fn</span></code> shall
15492                  be specializations of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, and <code class="computeroutput"><span class="identifier">Iterator</span></code> shall be a forward iterator
15493                  with a <code class="computeroutput"><span class="identifier">value_type</span></code>
15494                  which is a specialization of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>.
15495                </p></dd>
15496<dt><span class="term">Effects:</span></dt>
15497<dd><p>
15498                  Waits until at least one of the specified futures is <span class="emphasis"><em>ready</em></span>.
15499                </p></dd>
15500<dt><span class="term">Returns:</span></dt>
15501<dd><p>
15502                  The range-based overload returns an <code class="computeroutput"><span class="identifier">Iterator</span></code>
15503                  identifying the first future in the range that was detected as
15504                  <span class="emphasis"><em>ready</em></span>. The remaining overloads return the
15505                  zero-based index of the first future that was detected as <span class="emphasis"><em>ready</em></span>
15506                  (first parameter =&gt; 0, second parameter =&gt; 1, etc.).
15507                </p></dd>
15508<dt><span class="term">Throws:</span></dt>
15509<dd><p>
15510                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">thread_interrupted</span></code> if the current
15511                  thread is interrupted. Any exception thrown by the <span class="emphasis"><em>wait
15512                  callback</em></span> associated with any of the futures being waited
15513                  for. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code> if memory could not
15514                  be allocated for the internal wait structures.
15515                </p></dd>
15516<dt><span class="term">Notes:</span></dt>
15517<dd><p>
15518                  <code class="computeroutput"><span class="identifier">wait_for_any</span><span class="special">()</span></code>
15519                  is an <span class="emphasis"><em>interruption point</em></span>.
15520                </p></dd>
15521</dl>
15522</div>
15523</div>
15524<div class="section">
15525<div class="titlepage"><div><div><h5 class="title">
15526<a name="thread.synchronization.futures.reference.wait_for_all"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.wait_for_all" title="Non-member function wait_for_all() - EXTENSION">Non-member
15527          function <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
15528          - EXTENSION</a>
15529</h5></div></div></div>
15530<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
15531  <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span><span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">);</span> <span class="comment">// EXTENSION</span>
15532
15533<span class="keyword">template</span><span class="special">&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>
15534  <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
15535
15536<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>
15537  <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
15538
15539<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>
15540  <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
15541
15542<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>
15543  <span class="keyword">void</span> <span class="identifier">wait_for_all</span><span class="special">(</span><span class="identifier">F1</span><span class="special">&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>
15544</pre>
15545<div class="variablelist">
15546<p class="title"><b></b></p>
15547<dl class="variablelist">
15548<dt><span class="term">Preconditions:</span></dt>
15549<dd><p>
15550                  The types <code class="computeroutput"><span class="identifier">Fn</span></code> shall
15551                  be specializations of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>, and <code class="computeroutput"><span class="identifier">Iterator</span></code> shall be a forward iterator
15552                  with a <code class="computeroutput"><span class="identifier">value_type</span></code>
15553                  which is a specialization of <a class="link" href="synchronization.html#thread.synchronization.futures.reference.unique_future" title="future class template"><code class="computeroutput"><span class="identifier">future</span></code></a> or <a class="link" href="synchronization.html#thread.synchronization.futures.reference.shared_future" title="shared_future class template"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_future</span></code></a>.
15554                </p></dd>
15555<dt><span class="term">Effects:</span></dt>
15556<dd><p>
15557                  Waits until all of the specified futures are <span class="emphasis"><em>ready</em></span>.
15558                </p></dd>
15559<dt><span class="term">Throws:</span></dt>
15560<dd><p>
15561                  Any exceptions thrown by a call to <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> on the specified futures.
15562                </p></dd>
15563<dt><span class="term">Notes:</span></dt>
15564<dd><p>
15565                  <code class="computeroutput"><span class="identifier">wait_for_all</span><span class="special">()</span></code>
15566                  is an <span class="emphasis"><em>interruption point</em></span>.
15567                </p></dd>
15568</dl>
15569</div>
15570</div>
15571<div class="section">
15572<div class="titlepage"><div><div><h5 class="title">
15573<a name="thread.synchronization.futures.reference.when_all"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.when_all" title="Non-member function when_all() - EXTENSION">Non-member
15574          function <code class="computeroutput"><span class="identifier">when_all</span><span class="special">()</span></code>
15575          - EXTENSION</a>
15576</h5></div></div></div>
15577<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
15578  <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>
15579  <span class="identifier">when_all</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span>
15580
15581<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FutTypes</span><span class="special">&gt;</span>
15582  <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>
15583</pre>
15584<div class="variablelist">
15585<p class="title"><b></b></p>
15586<dl class="variablelist">
15587<dt><span class="term">Requires:</span></dt>
15588<dd><p>
15589                  - For the first overload, <code class="computeroutput"><span class="identifier">InputIterator</span></code>'s
15590                  value type shall be convertible to <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15591                  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
15592                  (i.e. <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
15593                  <span class="special">==</span> <span class="keyword">false</span></code>),
15594                  the behavior is undefined. - For the second overload, <code class="computeroutput"><span class="identifier">FutTypes</span></code> is of type <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>
15595                  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>
15596                  or a <code class="computeroutput"><span class="identifier">shared_future</span></code>
15597                  object for which <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
15598                  <span class="keyword">false</span></code> is undefined.
15599                </p></dd>
15600<dt><span class="term">Notes:</span></dt>
15601<dd>
15602<p>
15603                  - There are two variations of <code class="computeroutput"><span class="identifier">when_all</span></code>.
15604                  The first version takes a pair of <code class="computeroutput"><span class="identifier">InputIterators</span></code>.
15605                  The second takes any arbitrary number of <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15606                  need not be the same type.
15607                </p>
15608<p>
15609                  - Calling the first signature of <code class="computeroutput"><span class="identifier">when_all</span></code>
15610                  where <code class="computeroutput"><span class="identifier">InputIterator</span></code>
15611                  first equals last, returns a future with an empty <code class="computeroutput"><span class="identifier">vector</span></code> that is immediately ready.
15612                </p>
15613<p>
15614                  - Calling the second signature of <code class="computeroutput"><span class="identifier">when_all</span></code>
15615                  with no arguments returns a future&lt;tuple&lt;&gt;&gt; that is
15616                  immediately ready.
15617                </p>
15618</dd>
15619<dt><span class="term">Effects:</span></dt>
15620<dd>
15621<p>
15622                  - If any of the futures supplied to a call to <code class="computeroutput"><span class="identifier">when_all</span></code>
15623                  refer to deferred tasks that have not started execution, those
15624                  tasks are executed before the call to <code class="computeroutput"><span class="identifier">when_all</span></code>
15625                  returns. Once all such tasks have been executed, the call to <code class="computeroutput"><span class="identifier">when_all</span></code> returns immediately.
15626                </p>
15627<p>
15628                  - The call to <code class="computeroutput"><span class="identifier">when_all</span></code>
15629                  does not wait for non-deferred tasks, or deferred tasks that have
15630                  already started executing elsewhere, to complete before returning.
15631                </p>
15632<p>
15633                  - Once all the <code class="computeroutput"><span class="identifier">future</span></code>s/<code class="computeroutput"><span class="identifier">shared_future</span></code>s supplied to the
15634                  call to <code class="computeroutput"><span class="identifier">when_all</span></code>
15635                  are ready, the <code class="computeroutput"><span class="identifier">future</span></code>s/<code class="computeroutput"><span class="identifier">shared_future</span></code>s are moved/copied
15636                  into the associated state of the future returned from the call
15637                  to <code class="computeroutput"><span class="identifier">when_all</span></code>, preserving
15638                  the order of the futures supplied to <code class="computeroutput"><span class="identifier">when_all</span></code>.
15639                </p>
15640<p>
15641                  - The collection is then stored as the result in a newly created
15642                  shared state.
15643                </p>
15644<p>
15645                  - A new future object that refers to the shared state is created.
15646                  The exact type of the future is further described below.
15647                </p>
15648<p>
15649                  - The <code class="computeroutput"><span class="identifier">future</span></code> returned
15650                  by <code class="computeroutput"><span class="identifier">when_all</span></code> will
15651                  not throw an exception when calling <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>, but the futures held in the
15652                  output collection may.
15653                </p>
15654</dd>
15655<dt><span class="term">Returns:</span></dt>
15656<dd>
15657<p>
15658                  - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">tuple</span><span class="special">&lt;&gt;&gt;</span></code>
15659                  if <code class="computeroutput"><span class="identifier">when_all</span></code> is
15660                  called with zero arguments.
15661                </p>
15662<p>
15663                  - <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15664                  if the input cardinality is unknown at compile and the iterator
15665                  pair yields <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. The order of the futures in
15666                  the output vector will be the same as given by the input iterator.
15667                </p>
15668<p>
15669                  - <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15670                  if the input cardinality is unknown at compile time and the iterator
15671                  pair yields <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. The order of the futures in
15672                  the output vector will be the same as given by the input iterator.
15673                </p>
15674<p>
15675                  - <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15676                  if inputs are fixed in number.
15677                </p>
15678</dd>
15679<dt><span class="term">Postconditions:</span></dt>
15680<dd>
15681<p>
15682                  - All input futures valid() == false.
15683                </p>
15684<p>
15685                  - All input shared future valid() == true.
15686                </p>
15687<p>
15688                  - valid() == true.
15689                </p>
15690</dd>
15691</dl>
15692</div>
15693</div>
15694<div class="section">
15695<div class="titlepage"><div><div><h5 class="title">
15696<a name="thread.synchronization.futures.reference.when_any"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.when_any" title="Non-member function when_any() - EXTENSION">Non-member
15697          function <code class="computeroutput"><span class="identifier">when_any</span><span class="special">()</span></code>
15698          - EXTENSION</a>
15699</h5></div></div></div>
15700<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">&gt;</span>
15701  <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>
15702  <span class="identifier">when_any</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">);</span>
15703
15704<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span><span class="special">...</span> <span class="identifier">FutTypes</span><span class="special">&gt;</span>
15705  <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>
15706  <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>
15707</pre>
15708<div class="variablelist">
15709<p class="title"><b></b></p>
15710<dl class="variablelist">
15711<dt><span class="term">Requires:</span></dt>
15712<dd><p>
15713                  - For the first overload, <code class="computeroutput"><span class="identifier">InputIterator</span></code>'s
15714                  value type shall be convertible to <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15715                  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
15716                  (i.e. <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span>
15717                  <span class="special">==</span> <span class="keyword">false</span></code>),
15718                  the behavior is undefined. - For the second overload, <code class="computeroutput"><span class="identifier">FutTypes</span></code> is of type <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>
15719                  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>
15720                  or a <code class="computeroutput"><span class="identifier">shared_future</span></code>
15721                  object for which <code class="computeroutput"><span class="identifier">valid</span><span class="special">()</span> <span class="special">==</span>
15722                  <span class="keyword">false</span> <span class="identifier">is</span>
15723                  <span class="identifier">undefined</span></code>.
15724                </p></dd>
15725<dt><span class="term">Notes:</span></dt>
15726<dd>
15727<p>
15728                  - There are two variations of <code class="computeroutput"><span class="identifier">when_any</span>
15729                  </code>. The first version takes a pair of <code class="computeroutput"><span class="identifier">InputIterators</span></code>.
15730                  The second takes any arbitrary number of <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15731                  need not be the same type.
15732                </p>
15733<p>
15734                  - Calling the first signature of <code class="computeroutput"><span class="identifier">when_any</span>
15735                  </code> where <code class="computeroutput"><span class="identifier">InputIterator</span></code>
15736                  first equals last, returns a future with an empty <code class="computeroutput"><span class="identifier">vector</span></code> that is immediately ready.
15737                </p>
15738<p>
15739                  - Calling the second signature of <code class="computeroutput"><span class="identifier">when_any</span></code>
15740                  with no arguments returns a future&lt;tuple&lt;&gt;&gt; that is
15741                  immediately ready.
15742                </p>
15743</dd>
15744<dt><span class="term">Effects:</span></dt>
15745<dd>
15746<p>
15747                  - Each of the futures supplied to <code class="computeroutput"><span class="identifier">when_any</span></code>
15748                  is checked in the order supplied. If a given future is ready, then
15749                  no further futures are checked, and the call to <code class="computeroutput"><span class="identifier">when_any</span></code>
15750                  returns immediately. If a given future refers to a deferred task
15751                  that has not yet started execution, then no further futures are
15752                  checked, that task is executed, and the call to <code class="computeroutput"><span class="identifier">when_any</span></code>
15753                  then returns immediately.
15754                </p>
15755<p>
15756                  - The call to <code class="computeroutput"><span class="identifier">when_any</span></code>
15757                  does not wait for non-deferred tasks, or deferred tasks that have
15758                  already started executing elsewhere, to complete before returning.
15759                </p>
15760<p>
15761                  - Once at least one of the futures supplied to the call to <code class="computeroutput"><span class="identifier">when_any</span></code> are ready, the futures
15762                  are moved into the associated state of the future returned from
15763                  the call to <code class="computeroutput"><span class="identifier">when_any</span></code>,
15764                  preserving the order of the futures supplied to <code class="computeroutput"><span class="identifier">when_any</span></code>.
15765                  That future is then ready.
15766                </p>
15767<p>
15768                  - The collection is then stored as the result in a newly created
15769                  shared state.
15770                </p>
15771<p>
15772                  - A new future object that refers to the shared state is created.
15773                  The exact type of the future is further described below.
15774                </p>
15775<p>
15776                  - The future returned by <code class="computeroutput"><span class="identifier">when_any</span></code>
15777                  will not throw an exception when calling <code class="computeroutput"><span class="identifier">wait</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">get</span><span class="special">()</span></code>, but the futures held in the
15778                  output collection may.
15779                </p>
15780</dd>
15781<dt><span class="term">Returns:</span></dt>
15782<dd>
15783<p>
15784                  - <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">tuple</span><span class="special">&lt;&gt;&gt;</span></code>
15785                  if <code class="computeroutput"><span class="identifier">when_any</span> </code> is
15786                  called with zero arguments.
15787                </p>
15788<p>
15789                  - <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15790                  if the input cardinality is unknown at compile and the iterator
15791                  pair yields <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. The order of the futures in
15792                  the output vector will be the same as given by the input iterator.
15793                </p>
15794<p>
15795                  - <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15796                  if the input cardinality is unknown at compile time and the iterator
15797                  pair yields <code class="computeroutput"><span class="identifier">shared_future</span><span class="special">&lt;</span><span class="identifier">R</span><span class="special">&gt;</span></code>. The order of the futures in
15798                  the output vector will be the same as given by the input iterator.
15799                </p>
15800<p>
15801                  - <code class="computeroutput"><span class="identifier">future</span><span class="special">&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>
15802                  if inputs are fixed in number.
15803                </p>
15804</dd>
15805<dt><span class="term">Postconditions:</span></dt>
15806<dd>
15807<p>
15808                  - All input futures valid() == false.
15809                </p>
15810<p>
15811                  - All input shared_futures valid() == true.
15812                </p>
15813<p>
15814                  - valid() == true.
15815                </p>
15816</dd>
15817</dl>
15818</div>
15819</div>
15820<div class="section">
15821<div class="titlepage"><div><div><h5 class="title">
15822<a name="thread.synchronization.futures.reference.make_ready_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_ready_future" title="Non-member function make_ready_future() EXTENSION">Non-member
15823          function <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> EXTENSION</a>
15824</h5></div></div></div>
15825<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
15826  <span class="identifier">future</span><span class="special">&lt;</span><span class="identifier">V</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>
15827<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>
15828<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>
15829  <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>
15830<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>
15831  <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>
15832</pre>
15833<div class="variablelist">
15834<p class="title"><b></b></p>
15835<dl class="variablelist">
15836<dt><span class="term">Remark:</span></dt>
15837<dd><p>
15838                  where <code class="computeroutput"><span class="identifier">V</span></code> is determined
15839                  as follows: Let <code class="computeroutput"><span class="identifier">U</span></code>
15840                  be <code class="computeroutput"><span class="identifier">decay_t</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>.
15841                  Then <code class="computeroutput"><span class="identifier">V</span></code> is <code class="computeroutput"><span class="identifier">X</span><span class="special">&amp;</span></code>
15842                  if <code class="computeroutput"><span class="identifier">U</span></code> equals <code class="computeroutput"><span class="identifier">reference_wrapper</span><span class="special">&lt;</span><span class="identifier">X</span><span class="special">&gt;</span></code>,
15843                  otherwise <code class="computeroutput"><span class="identifier">V</span></code> is
15844                  <code class="computeroutput"><span class="identifier">U</span></code>.
15845                </p></dd>
15846<dt><span class="term">Effects:</span></dt>
15847<dd>
15848<p>
15849                  - value prototype: The value that is passed into the function is
15850                  moved to the shared state of the returned future if it is an rvalue.
15851                  Otherwise the value is copied to the shared state of the returned
15852                  future.
15853                </p>
15854<p>
15855                  - exception: The exception that is passed into the function is
15856                  copied to the shared state of the returned future.
15857                </p>
15858<p>
15859                  .
15860                </p>
15861</dd>
15862<dt><span class="term">Returns:</span></dt>
15863<dd>
15864<p>
15865                  - a ready future with the value set with <code class="computeroutput"><span class="identifier">value</span></code>
15866                </p>
15867<p>
15868                  - a ready future with the exception set with <code class="computeroutput"><span class="identifier">ex</span></code>
15869                </p>
15870<p>
15871                  - a ready future&lt;void&gt; with the value set (void).
15872                </p>
15873</dd>
15874<dt><span class="term">Postcondition:</span></dt>
15875<dd>
15876<p>
15877                  - Returned future, valid() == true
15878                </p>
15879<p>
15880                  - Returned future, is_ready() = true
15881                </p>
15882<p>
15883                  - Returned future, has_value() = true or has_exception() depending
15884                  on the prototype.
15885                </p>
15886</dd>
15887</dl>
15888</div>
15889</div>
15890<div class="section">
15891<div class="titlepage"><div><div><h5 class="title">
15892<a name="thread.synchronization.futures.reference.make_exceptional_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_exceptional_future" title="Non-member function make_exceptional_future() EXTENSION">Non-member
15893          function <code class="computeroutput"><span class="identifier">make_exceptional_future</span><span class="special">()</span></code> EXTENSION</a>
15894</h5></div></div></div>
15895<pre class="programlisting"><span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">(</span><span class="identifier">exception_ptr</span> <span class="identifier">ex</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
15896<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span>
15897  <span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">(</span><span class="identifier">E</span> <span class="identifier">ex</span><span class="special">);</span>  <span class="comment">// EXTENSION</span>
15898<span class="identifier">exceptional_ptr</span> <span class="identifier">make_exceptional_future</span><span class="special">();</span>  <span class="comment">// EXTENSION</span>
15899</pre>
15900<div class="variablelist">
15901<p class="title"><b></b></p>
15902<dl class="variablelist">
15903<dt><span class="term">Effects:</span></dt>
15904<dd><p>
15905                  The exception that is passed in to the function or the current
15906                  exception if no parameter is given is moved into the returned
15907                  <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>
15908                  if it is an rvalue. Otherwise the exception is copied into the
15909                  returned <code class="computeroutput"><span class="identifier">exceptional_ptr</span></code>.
15910                </p></dd>
15911<dt><span class="term">Returns:</span></dt>
15912<dd><p>
15913                  An exceptional_ptr instance implicitly convertible to a future&lt;T&gt;
15914                </p></dd>
15915</dl>
15916</div>
15917</div>
15918<div class="section">
15919<div class="titlepage"><div><div><h5 class="title">
15920<a name="thread.synchronization.futures.reference.make_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_future" title="Non-member function make_future() DEPRECATED">Non-member
15921          function <code class="computeroutput"><span class="identifier">make_future</span><span class="special">()</span></code>
15922          DEPRECATED</a>
15923</h5></div></div></div>
15924<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
15925  <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>
15926<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>
15927</pre>
15928<div class="variablelist">
15929<p class="title"><b></b></p>
15930<dl class="variablelist">
15931<dt><span class="term">Effects:</span></dt>
15932<dd><p>
15933                  The value that is passed into the function is moved to the shared
15934                  state of the returned function if it is an rvalue. Otherwise the
15935                  value is copied to the shared state of the returned function. .
15936                </p></dd>
15937<dt><span class="term">Returns:</span></dt>
15938<dd>
15939<p>
15940                  - future&lt;T&gt;, if function is given a value of type T
15941                </p>
15942<p>
15943                  - future&lt;void&gt;, if the function is not given any inputs.
15944                </p>
15945</dd>
15946<dt><span class="term">Postcondition:</span></dt>
15947<dd>
15948<p>
15949                  - Returned future&lt;T&gt;, valid() == true
15950                </p>
15951<p>
15952                  - Returned future&lt;T&gt;, is_ready() = true
15953                </p>
15954</dd>
15955<dt><span class="term">See:</span></dt>
15956<dd><p>
15957                  <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code>
15958                </p></dd>
15959</dl>
15960</div>
15961</div>
15962<div class="section">
15963<div class="titlepage"><div><div><h5 class="title">
15964<a name="thread.synchronization.futures.reference.make_shared_future"></a><a class="link" href="synchronization.html#thread.synchronization.futures.reference.make_shared_future" title="Non-member function make_shared_future() DEPRECATED">Non-member
15965          function <code class="computeroutput"><span class="identifier">make_shared_future</span><span class="special">()</span></code> DEPRECATED</a>
15966</h5></div></div></div>
15967<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
15968  <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>
15969<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>
15970</pre>
15971<div class="variablelist">
15972<p class="title"><b></b></p>
15973<dl class="variablelist">
15974<dt><span class="term">Effects:</span></dt>
15975<dd><p>
15976                  The value that is passed in to the function is moved to the shared
15977                  state of the returned function if it is an rvalue. Otherwise the
15978                  value is copied to the shared state of the returned function. .
15979                </p></dd>
15980<dt><span class="term">Returns:</span></dt>
15981<dd>
15982<p>
15983                  - shared_future&lt;T&gt;, if function is given a value of type
15984                  T
15985                </p>
15986<p>
15987                  - shared_future&lt;void&gt;, if the function is not given any inputs.
15988                </p>
15989</dd>
15990<dt><span class="term">Postcondition:</span></dt>
15991<dd>
15992<p>
15993                  - Returned shared_future&lt;T&gt;, valid() == true
15994                </p>
15995<p>
15996                  - Returned shared_future&lt;T&gt;, is_ready() = true
15997                </p>
15998</dd>
15999<dt><span class="term">See:</span></dt>
16000<dd><p>
16001                  <code class="computeroutput"><span class="identifier">make_ready_future</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">future</span><span class="special">&lt;&gt;::</span><span class="identifier">share</span><span class="special">()</span></code>
16002                </p></dd>
16003</dl>
16004</div>
16005</div>
16006</div>
16007</div>
16008</div>
16009<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
16010<td align="left"></td>
16011<td align="right"><div class="copyright-footer">Copyright © 2007 -11 Anthony Williams<br>Copyright © 2011 -17 Vicente J. Botet Escriba<p>
16012        Distributed under the Boost Software License, Version 1.0. (See accompanying
16013        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
16014      </p>
16015</div></td>
16016</tr></table>
16017<hr>
16018<div class="spirit-nav">
16019<a accesskey="p" href="ScopedThreads.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../thread.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="thread_local_storage.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
16020</div>
16021</body>
16022</html>
16023